HDU 欧拉回路

来源:互联网 发布:白金数据 magnet 编辑:程序博客网 时间:2024/06/04 22:28


欧拉回路

 ime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14804    Accepted Submission(s): 5667


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

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

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

Sample Input
3 31 21 32 33 21 22 30
 

Sample Output
10
 

Author
ZJU
 

Source
浙大计算机研究生复试上机考试-2008年
 

Recommend
思路:这是一个图论入门题。欧拉图中无奇数顶点,通过每条边一次切一次经过所有顶点的回路的图。要经过dfs,边的遍历 。还有那个每个度的检验,必须都为偶数。
#include<stdio.h>#include<vector>#include<string.h>using namespace std;vector<int>G[10000];int vis[1000];void dfs(int i){    vis[i]=1;     //走过的顶点都标记过。    for(int j=0; j<G[i].size(); j++)    {        int v=G[i][j];        if(!vis[v])            dfs(v);    }    return ;}int main(){    int n,m,i,a,b;    while(~scanf("%d %d",&n,&m),n)    {        memset(vis,0,sizeof(vis));        for(i=1; i<=n; i++)            G[i].clear();        for(i=0; i<m; i++)        {            scanf("%d %d",&a,&b);            G[a].push_back(b);            G[b].push_back(a);        }        int k=0,s=0;        for(i=1; i<=n; i++)        {            if(!vis[k])            {                k++;                if(k>2)        //一次调用就经历过所有顶点                    break;                 dfs(i);            }        }        for(i=1; i<=n; i++)        {            int t=G[i].size();             if(t%2)             //判断是奇数顶点还是偶数顶点。                s++;        }        if(k==1&&s==0)            printf("%d\n",k);        else printf("0\n");    }    return 0;}