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 }
     
  • 相关阅读:
    字符串替换
    字符串查找
    字符串比较
    字节与字符串相互转换
    1365. How Many Numbers Are Smaller Than the Current Number
    1486. XOR Operation in an Array
    1431. Kids With the Greatest Number of Candies
    1470. Shuffle the Array
    1480. Running Sum of 1d Array
    【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合
  • 原文地址:https://www.cnblogs.com/Penn000/p/5883249.html
Copyright © 2011-2022 走看看