1154 Vertex Coloring

大致题意就是给出一个无向图(可能包含若干连通块)、各顶点的权值,如果每一条边上两顶点的权值均不相同,那么输出所有不同权值的顶点个数,否则输出No。

 由于题目顶点数 最多是10000,所以采用邻接表存储无向图。

然后使用DFS+回溯剪枝,遍历所有连通块的所有边,并对边上两顶点的权值进行判断即可。

 1 #include<iostream>
 2 #include<vector>
 3 #include<unordered_map>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 10010;
 8 vector<int> adj[maxn];//邻接表
 9 int weight[maxn];
10 bool visited[maxn],flag;
11 void DFS(int v) {
12     visited[v] = true;
13     for(int i = 0; i < adj[v].size() && flag == false; ++i) {
14         if(weight[v] != weight[adj[v][i]]) {
15             if(visited[adj[v][i]] == false) {
16                 DFS(adj[v][i]);
17             }
18         } else flag = true;
19     }
20 }
21 
22 void DFStrave(int n) {
23     for(int i = 0; i < n; ++i) {
24         if(visited[i] == false && flag == false)
25             DFS(i);
26     }
27 }
28 
29 int main() {
30     int n,m,u,v,k;
31     scanf("%d%d",&n,&m);
32     for(int i = 0; i < m; ++i) {
33         scanf("%d%d",&u,&v);
34         adj[u].push_back(v);
35         adj[v].push_back(u);
36     }
37     scanf("%d",&k);
38     for(int i = 0; i < k; ++i) {
39         unordered_map<int,int> mp;
40         flag = false;
41         for(int j = 0; j < n; ++j) {
42             scanf("%d",&weight[j]);
43             mp[weight[j]] = 1;
44         }
45         fill(visited,visited+maxn,false);
46         DFStrave(n);
47         if(flag == true) printf("No\n");
48         else printf("%d-coloring\n",mp.size());
49     }
50     return 0;
51 }

其实可以不用DFS+回溯剪枝,直接两个for循环完成 遍历所有边。

 1 #include<iostream>
 2 #include<vector>
 3 #include<unordered_map>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 10010;
 8 vector<int> adj[maxn];//邻接表
 9 int weight[maxn];
10 
11 int main() {
12     int n,m,u,v,k;
13     scanf("%d%d",&n,&m);
14     for(int i = 0; i < m; ++i) {
15         scanf("%d%d",&u,&v);
16         adj[u].push_back(v);
17         adj[v].push_back(u);
18     }
19     scanf("%d",&k);
20     for(int i = 0; i < k; ++i) {
21         unordered_map<int,int> mp;
22         bool flag = false;
23         for(int j = 0; j < n; ++j) {
24             scanf("%d",&weight[j]);
25             mp[weight[j]] = 1;
26         }
27         for(int u = 0; u < n; ++u) { //遍历所有边
28             for(int v = 0; v < adj[u].size(); ++v) {
29                 if(weight[u] == weight[adj[u][v]]) {
30                     flag = true;
31                     break;
32                 }
33             }
34         }
35         if(flag == true) printf("No\n");
36         else printf("%d-coloring\n",mp.size());
37     }
38     return 0;
39 }

 

posted @ 2020-03-12 22:39  tangq123  阅读(190)  评论(0)    收藏  举报