Advertisement

HDU 1878 欧拉回路(判断欧拉回路)

阅读量:

题意:略

解题思路:判断是否连通, 有没有度为奇数的点。并查集, DFS都可以, 用链式向前星建图会超时, 不知道为什么, 邻接矩阵反而不超时。

欧拉回路

**Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10725 Accepted Submission(s): 3902
**

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
复制代码
 #include<algorithm>

    
 #include<cstdio>
    
 #include<cstdlib>
    
 #include<cstring>
    
 #include<cmath>
    
 #include<cctype>
    
 #include<list>
    
 #include<iostream>
    
 #include<map>
    
 #include<queue>
    
 #include<set>
    
 #include<stack>
    
 #include<vector>
    
  
    
 using namespace std;
    
  
    
 #define FOR(i, s, t) for(int i = (s) ; i <= (t) ; ++i)
    
 #define REP(i, n) for(int i = 0 ; i < (n) ; ++i)
    
  
    
 int buf[10];
    
 inline long long read()
    
 {
    
     long long x=0,f=1;
    
     char ch=getchar();
    
     while(ch<'0'||ch>'9')
    
     {
    
     if(ch=='-')f=-1;
    
     ch=getchar();
    
     }
    
     while(ch>='0'&&ch<='9')
    
     {
    
     x=x*10+ch-'0';
    
     ch=getchar();
    
     }
    
     return x*f;
    
 }
    
  
    
 inline void writenum(int i)
    
 {
    
     int p = 0;
    
     if(i == 0) p++;
    
     else while(i)
    
     {
    
         buf[p++] = i % 10;
    
         i /= 10;
    
     }
    
     for(int j = p - 1 ; j >= 0 ; --j) putchar('0' + buf[j]);
    
 }
    
 /**************************************************************/
    
 #define MAX_N 1005
    
 const int INF = 0x3f3f3f3f;
    
 int G[MAX_N][MAX_N];
    
 bool vis[MAX_N];
    
 int degree[MAX_N];
    
 int n, m;
    
 void dfs(int u)
    
 {
    
     vis[u] = true;
    
     for(int i = 1 ; i <= n ; i++)
    
     {
    
     if(G[u][i] && !vis[i])
    
     {
    
         dfs(i);
    
     }
    
     }
    
     return;
    
 }
    
  
    
 inline void init()
    
 {
    
     memset(vis, false, sizeof(vis));
    
     memset(G, 0, sizeof(G));
    
     memset(degree, 0, sizeof(degree));
    
 }
    
  
    
 int main()
    
 {
    
 //    int n, m;
    
     while(scanf("%d", &n) && n)
    
     {
    
     init();
    
     scanf("%d", &m);
    
     int u, v;
    
     for(int i = 0 ; i < m ; i++)
    
     {
    
         u = read();
    
         v = read();
    
         G[u][v] = G[v][u] = 1;
    
         degree[u]++;
    
         degree[v]++;
    
     }
    
     dfs(1);
    
     int flag = 0;
    
     for(int i = 1 ; i <= n ;i++)
    
     {
    
         if(degree[i] % 2)
    
         {
    
             flag = 1;
    
             break;
    
         }
    
         if(!vis[i])
    
         {
    
             flag = 1;
    
             break;
    
         }
    
     }
    
     if(flag)
    
     {
    
         printf("0\n");
    
 //            continue;
    
     }
    
     else
    
     {
    
         printf("1\n");
    
     }
    
  
    
     }
    
  
    
     return 0;
    
 }

2.

复制代码
 #include<algorithm>

    
 #include<cstdio>
    
 #include<cstdlib>
    
 #include<cstring>
    
 #include<cmath>
    
 #include<cctype>
    
 #include<list>
    
 #include<iostream>
    
 #include<map>
    
 #include<queue>
    
 #include<set>
    
 #include<stack>
    
 #include<vector>
    
  
    
 using namespace std;
    
  
    
 #define FOR(i, s, t) for(int i = (s) ; i <= (t) ; ++i)
    
 #define REP(i, n) for(int i = 0 ; i < (n) ; ++i)
    
  
    
 int buf[10];
    
 inline long long read()
    
 {
    
     long long x=0,f=1;
    
     char ch=getchar();
    
     while(ch<'0'||ch>'9')
    
     {
    
     if(ch=='-')f=-1;
    
     ch=getchar();
    
     }
    
     while(ch>='0'&&ch<='9')
    
     {
    
     x=x*10+ch-'0';
    
     ch=getchar();
    
     }
    
     return x*f;
    
 }
    
  
    
 inline void writenum(int i)
    
 {
    
     int p = 0;
    
     if(i == 0) p++;
    
     else while(i)
    
     {
    
         buf[p++] = i % 10;
    
         i /= 10;
    
     }
    
     for(int j = p - 1 ; j >= 0 ; --j) putchar('0' + buf[j]);
    
 }
    
 /**************************************************************/
    
 #define MAX_N 1005
    
 const int INF = 0x3f3f3f3f;
    
 int parent[MAX_N];
    
 int degree[MAX_N];
    
 inline void init(int n)
    
 {
    
     memset(degree, 0, sizeof(degree));
    
     for(int i = 1 ; i <=  n + 1 ; i++)
    
     {
    
     parent[i] = i;
    
     }
    
 }
    
  
    
 int find(int a)
    
 {
    
     if(parent[a] != a)
    
     {
    
     parent[a] = find(parent[a]);
    
     }
    
     return parent[a];
    
 }
    
  
    
 void unite(int a, int b)
    
 {
    
     int fa = find(a);
    
     int fb = find(b);
    
     if(fa == fb) return;
    
     parent[fb] = fa;
    
 }
    
  
    
 int same(int a, int b)
    
 {
    
     return find(a) == find(b);
    
 }
    
  
    
 int main()
    
 {
    
     int n, m;
    
     while(scanf("%d", &n) && n)
    
     {
    
     init(n);
    
     scanf("%d", &m);
    
     for(int i = 0 ; i < m ;i++)
    
     {
    
         int u = read();
    
         int v = read();
    
         unite(u, v);
    
         degree[u]++;
    
         degree[v]++;
    
     }
    
     int flag = 0;
    
     for(int i = 1 ;i <= n ;i++)
    
     {
    
         if(degree[i] % 2)
    
         {
    
             flag = 1;
    
             break;
    
         }
    
     }
    
     if(flag)
    
     {
    
         printf("0\n");
    
         continue;
    
     }
    
     int tmp = parent[1];
    
     for(int i = 2 ; i <= n ; i++)
    
     {
    
         if(tmp != find(i))
    
         {
    
             flag = 1;
    
             break;
    
         }
    
     }
    
     if(flag)
    
     {
    
         printf("0\n");
    
         continue;
    
     }
    
     printf("1\n");
    
     }
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~