题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878
解题思路:
①欧拉回路的定义:从图中某一顶点出发,所有边仅经过一次,最后回到该顶点。
②判断欧拉回路:
前提:这个图是连通的,也就是所有点都连在一个图上了
无向图:顶点度数为偶数
有向图:所有点入度 = 出度
③判断是否连通用并查集即可,另外就是度数的统计。
对于并查集陌生可以参考: https://blog.csdn.net/weixin_43768644/article/details/89926834
代码:
#include<cstdio>
using namespace std;
const int N = 1e3+5;
int deg[N];
int uf[N];
int find1(int x)
{
int r = x;
while (r!=uf[r]) r=uf[r];
for (int i=x,j;i!=r;i=j){
j = uf[i];
uf[i] = r;
}
return r;
}
void join(int a,int b)
{
int c = find1(a),d = find1(b);
if (c!=d) uf[c] = d;
}
int main()
{
int T,n,m,u,v;
while (scanf("%d",&n),n){
scanf("%d",&m);
for (int i=1;i<=n;i++) deg[i] = 0,uf[i] = i;///初始化
while (m--){
scanf("%d %d",&u,&v);
join(u,v);
deg[u]++;
deg[v]++;
}
int cnt = 0;
for (int i=1;i<=n;i++) if (uf[i]==i) cnt++;
if (cnt==1){
bool flag = true;
for (int i=1;i<=n;i++) if (deg[i]&1) {flag = false;break;}
if (flag) printf("1\n");
else printf("0\n");
}
else printf("0\n");
}
return 0;
}