[关闭]
@w616561153 2020-02-25T19:15:55.000000Z 字数 956 阅读 403

染色过程 c++版

课设-染色问题


  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 1e3 + 50;
  4. int v, e, m;
  5. int flag = 0;
  6. int vis[MAXN]; //vis[i] = x 第i个点用x颜色染色.
  7. vector<int> G[MAXN]; //用向量vector来存图,G[u]中有值v1,v2,v3...说明u -- v1, u -- v2, u -- v3, ...
  8. void add_edge(int u, int v) //加入边.
  9. {
  10. G[u].push_back(v);
  11. return;
  12. }
  13. void dfs(int now) //用深度搜索来解决这个问题.先把now这个结点染上一种和它所连接的点都不冲突的颜色,然后再染now + 1这个点,如果把v个点都成功染色了,那么这个问题就得到了解决.如果在第v个点染色之前,m种颜色就不够用了,那说明m种颜色解决不了这个问题.
  14. //但这个问题比较经典哈,人类运用计算机已经完全攻克图染色问题了.任何一张图(无论有几个结点,什么样的边)最多用四种颜色都能成功染色.
  15. {
  16. if(now == v + 1){ //到第v + 1个点,这说明前v个点已经染色成功了.
  17. flag = 1;
  18. return;
  19. }
  20. for(int i = 1; i <= m; i ++){ //m种颜色挨个试一下.
  21. int t = 1;
  22. for(int j = 0; j < G[now].size(); j ++){ //与now结点连着的点有没有颜色相同的.
  23. int v = G[now][j];
  24. if(vis[v] == i){
  25. t = 0;
  26. break;
  27. }
  28. }
  29. if(t){ //如果now点染成i可行,那么往下继续搜索,dfs(now + 1).
  30. vis[now] = i;
  31. dfs(now + 1);
  32. if(flag) //问题已经解决,找到了一组解,直接结束.
  33. return;
  34. }
  35. }
  36. }
  37. int main()
  38. {
  39. scanf("%d%d%d", &v, &e, &m);
  40. for(int i = 0; i < e; i ++){ //输入边.
  41. int u, v;
  42. scanf("%d%d", &u, &v);
  43. add_edge(u, v);
  44. add_edge(v, u);
  45. }
  46. dfs(1);
  47. if(flag)
  48. for(int i = 1; i <= v; i ++)
  49. cout << i << " " << vis[i] << endl;
  50. else
  51. cout << "染色失败.";
  52. return 0;
  53. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注