Strange Housing CodeForces - 1471F
生活随笔
收集整理的這篇文章主要介紹了
Strange Housing CodeForces - 1471F
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
有 n 個點和 m 條邊,對點進行染色。要求一條邊的兩個點不能都染色,并且刪除兩端都沒有染色的邊之后,圖連通。請給出一種染色方案。
題解:
第一反應就是01染色,但是題目是有可能存在奇環的,那怎么辦?
01染色是保證1和1,0和0都不能相鄰,如果把1當做染色,根據本題,0是可以相鄰的,那我們把01染色的dfs改成bfs的形式,也就是與1相鄰的點都是0,然后對于每個0,所能到的下一個點就是1,然后對1操作,1的周圍都是0,這樣循環進行就可以
BFS遍歷所有的點。
證明:顯然這種方案不會存在一條邊的兩端都染色的情況,并且如果圖不連通,一定是有一個點連接的所有點都不染色,而這樣的點一定會在第一種情況下被染色,所以圖一定是連通的。
當然如果圖本身就不連通直接輸出NO
u1s1,div2的F題比我想象的要簡單多
代碼:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<vector> #include<queue> #include<map> using namespace std; #define LL long long #define eps (1e-8) const int maxn = 3e5 + 10; const int inf = 0x3f3f3f3f; const LL mod = 1e9 + 7; struct node {int v, nxt; }e[maxn << 1]; int head[maxn], cnt; void add(int u, int v) {e[++cnt].v = v;e[cnt].nxt = head[u];head[u] = cnt; } int vis[maxn];//標記為1是染色,0位不染色,-1位還未遍歷的點 queue<int>q; void bfs(int u) {vis[u] = 1;for (int i = head[u]; i; i = e[i].nxt){int v = e[i].v;// if (vis[v] == -1){vis[v] = 0; q.push(v);//存的都是不染色的點}} } void solve() {while (!q.empty()){int u = q.front();q.pop();for (int i = head[u]; i; i = e[i].nxt){int v = e[i].v;//v為染色點 if (vis[v] == -1){bfs(v);}}} } int main() {int t;scanf("%d", &t);while (t--){cnt = 0;int n, m;scanf("%d%d", &n, &m);for (int i = 0; i <= n; i++){head[i] = 0;vis[i] = -1;}int u, v;while (m--){scanf("%d%d", &u, &v);add(u, v), add(v, u);}bfs(1);solve();int flag = 1, ans = 0;for (int i = 1; i <= n; i++){if (vis[i] == 1)ans++;else if (vis[i] == -1)//說明有的點沒有遍歷到,圖不連通 {flag = 0;}}if (flag){printf("YES\n");printf("%d\n", ans);for (int i = 1; i <= n; i++){if (vis[i] == 1)printf("%d ", i);}printf("\n");}else{printf("NO\n");}}return 0; }總結
以上是生活随笔為你收集整理的Strange Housing CodeForces - 1471F的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页颜色怎么选择(网页颜色怎么选择出来)
- 下一篇: Strange Partition Co