题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878
题目大意:中文题,不解释。。
题目思路:首先判断节点的度是否为偶数,如果不是就直接输出0,如果满足这个条件后,判断这个图是否为连通图,方法是从一个点开始dfs,如果结束的时候走过了n个点,那么就是连通图,否则就不是。。代码写的有些乱。。惭愧惭愧。。链式前向星存图
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1100;
struct Side{int to,next;}side[maxn*maxn];
int node[maxn],top=0;
int ans=0,vis[maxn],vv[maxn][maxn];
void add_side(int a,int b)
{
side[top]=(Side){b,node[a]};
node[a]=top++;
}
void dfs(int u)
{
vis[u]=1;ans++;
for(int i=node[u];i!=-1;i=side[i].next)
{
int v=side[i].to;
if(vis[v])continue;
dfs(v);
}
}
int in[maxn];
int main()
{
int n,m;
while(~scanf("%d",&n),n)
{
memset(node,-1,sizeof(node));
memset(vis,0,sizeof(vis));
memset(vv,0,sizeof(vv));
memset(in,0,sizeof(in));
ans=top=0;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add_side(a,b);
add_side(b,a);
if(vv[a][b])continue;
vv[a][b]=vv[b][a]=1;
in[a]++;in[b]++;
}
int flag=0;
for(int i=1;i<=n;i++)
if(!in[i]||in[i]%2){flag=1;break;}
if(flag==1){cout<<0<<endl;continue;}
dfs(1);
if(ans!=n){cout<<0<<endl;continue;}
cout<<1<<endl;
}
return 0;
}