zoukankan      html  css  js  c++  java
  • 图论

    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
    ",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
    ", Case++);
     96         if (!flag) printf("some beads may be lost
    ");
     97         else
     98         {
     99             Print_Eulerian_cycle(st);
    100         }
    101         if (t) printf("
    ");
    102     }
    103     return 0;
    104 }
    View Code
  • 相关阅读:
    什么是前后端分离?
    Ubuntu修改时区和更新时间
    待学
    Pycharm默认输入状态是insert状态,选中文字无法直接输入替换或删除
    使用jsonify返回json数据
    Linux
    Linux
    Linux
    JavaScript
    JavaScript
  • 原文地址:https://www.cnblogs.com/ivan-count/p/7503063.html
Copyright © 2011-2022 走看看