zoukankan      html  css  js  c++  java
  • 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 }
     
  • 相关阅读:
    【转】你可能不知道的Shell
    【转】28个Unix/Linux的命令行神器
    ubuntu创建桌面快捷方式
    linux解压zip乱码解决方案
    全能系统监控工具dstat
    【转】linux sar命令详解
    等级保护测评策略建议整改措施
    oracle dataguard详解和环境搭建
    Oracle RMAN备份和异机恢复
    Oracle异机恢复处理
  • 原文地址:https://www.cnblogs.com/Penn000/p/5883249.html
Copyright © 2011-2022 走看看