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 }


浙公网安备 33010602011771号