图论

1、uva 10054 The Necklace(欧拉回路)

  题意:有n个具有两种颜色的珠子,现在需要将其串起来,要求前后珠子相邻颜色相同。

  思路:以每一种颜色为结点,以珠子为边,判断是否联通和是否存在欧拉回路。

  1 #include<iostream>
  2 #include<vector>
  3 #include<queue>
  4 #include<cstring>
  5 using namespace std;
  6 const int maxn = 60;
  7 vector<int>mp[maxn];
  8 //判断图是否联通
  9 bool vis[maxn];
 10 bool BFS(int rt)
 11 {
 12     memset(vis, 0, sizeof(vis));
 13     for (int i = 1; i <= 50; i++) if (mp[i].size() == 0) vis[i] = true;
 14     queue<int>q;
 15     q.push(rt);
 16     vis[rt] = true;
 17     while (!q.empty())
 18     {
 19         int u = q.front();
 20         q.pop();
 21         int sz = mp[u].size();
 22         for (int i = 0; i < sz; i++)
 23         {
 24             if (!vis[mp[u][i]])
 25             {
 26                 vis[mp[u][i]] = true;
 27                 q.push(mp[u][i]);
 28             }
 29         }
 30     }
 31     for (int i = 1; i <= 50; i++) if (!vis[i]) return false;
 32     else return true;
 33 }
 34 
 35 // 输出欧拉回路,思路是先找出一个环,然后将此环从图中删除,继续从下一个起点开始找环,将这些环在公  
 36 // 共端点连接起来即构成一条欧拉回路。可以使用递归来实现。  
 37 int isconnect[maxn][maxn];
 38 void Print_Eulerian_cycle(int rt)
 39 {
 40     int sz = mp[rt].size();
 41     int to=-1;
 42     for (int i = 0; i < sz; i++)
 43     {
 44         if (isconnect[rt][mp[rt][i]])
 45         {
 46             isconnect[rt][mp[rt][i]]--;
 47             isconnect[mp[rt][i]][rt]--;
 48             Print_Eulerian_cycle(mp[rt][i]);
 49             printf("%d %d\n",mp[rt][i],rt);
 50         }
 51     }
 52 }
 53 int main()
 54 {
 55     int t;
 56     scanf("%d", &t);
 57     int Case = 1;
 58     while (t--)
 59     {
 60         int n;
 61         scanf("%d", &n);
 62         memset(isconnect, 0, sizeof(isconnect));
 63         for (int i = 0; i < maxn; i++) mp[i].clear();
 64         while (n--)
 65         {
 66             int u, v;
 67             scanf("%d%d", &u, &v);
 68             mp[u].push_back(v);
 69             mp[v].push_back(u);
 70             isconnect[u][v]++;
 71             isconnect[v][u]++;
 72         }
 73         bool flag;
 74         int st;
 75         for (int i = 1; i <= 50; i++)
 76         {
 77             if (mp[i].size())
 78             {
 79                 st = i;
 80                 flag = BFS(i);
 81                 break;
 82             }
 83         }
 84         if (flag)
 85         {
 86             for (int i = 1; i <= 50; i++)
 87             {
 88                 if (mp[i].size() % 2 == 1)
 89                 {//判断每个点的度数是否都是偶数
 90                     flag = false;
 91                     break;
 92                 }
 93             }
 94         }
 95         printf("Case #%d\n", Case++);
 96         if (!flag) printf("some beads may be lost\n");
 97         else
 98         {
 99             Print_Eulerian_cycle(st);
100         }
101         if (t) printf("\n");
102     }
103     return 0;
104 }
View Code

 

posted @ 2017-09-11 01:17  萌萌的美男子  阅读(141)  评论(0编辑  收藏  举报