• HDU1878(欧拉回路)


    欧拉回路

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 13288    Accepted Submission(s): 4956


    Problem Description

    欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
     

    Input 

    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
    束。
     

    Output

    每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
     

    Sample Input

    3 3
    1 2
    1 3
    2 3
    3 2
    1 2
    2 3
    0
     

    Sample Output

    1
    0
     
    计算每一个节点的度,必须为偶数,用并查集判断图是否连通,好挫的n2写法啊。。。
     1 //2016.9.18
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #define N 1005
     6 
     7 using namespace std;
     8 
     9 int G[N][N], vis[N][N], n, m, fa[N];
    10 
    11 void init(int n)
    12 {
    13     for(int i = 1; i <= n; i++)
    14           fa[i] = i;
    15 }
    16 
    17 int getfa(int a)
    18 {
    19     if(fa[a] == a)return a;
    20     return fa[a] = getfa(fa[a]);
    21 }
    22 
    23 int Merge(int a, int b)
    24 {
    25     int af = getfa(a);
    26     int bf = getfa(b);
    27     if(af!=bf)fa[bf] = af;
    28 }
    29 
    30 int main()
    31 {
    32     int u, v;
    33     while(scanf("%d", &n)!=EOF && n)
    34     {
    35         scanf("%d", &m);
    36         memset(G, -1, sizeof(G));
    37         init(n);
    38         for(int i = 0; i < m; i++)
    39         {
    40             scanf("%d%d", &u, &v);
    41             G[u][v] = G[v][u] = 1;
    42             Merge(u, v);
    43         }
    44         int cnt = 0;
    45         for(int i = 1; i <= n; i++)//所有节点的度必须为偶数
    46         {
    47             int idx = 0;
    48             for(int j = 1; j <= n; j++)
    49             {
    50                 if(i == j)continue;
    51                 if(G[i][j]==1)idx++;
    52             }
    53             if(idx&1)cnt++;
    54             if(cnt > 0)break;
    55         }
    56         bool fg = true;
    57         int ct = 0;
    58         for(int i = 1; i <= n; i++)//判断图是否连通
    59         {
    60             if(fa[i]==i)ct++;
    61             if(ct>1){
    62                 fg = false;
    63                 break;
    64             }
    65         }
    66         if(cnt == 0 && fg)printf("1
    ");
    67         else printf("0
    ");
    68     }
    69 
    70     return 0;
    71 }
     
  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/Penn000/p/5883249.html
Copyright © 2020-2023  润新知