您的位置:首页 > 其它

PAT(A)-1126. Eulerian Path (25)(欧拉图的判断)

2017-03-07 20:35 357 查看
记录一个菜逼的成长。。

题目链接

题目大意:

给你一个图,判断是欧拉回路,还是不是欧拉回路的欧拉通路,还是不是欧拉图。

1.先判断是不是连通图,并查集维护一下

2.判断奇数点得个数,不是0就是2.0是回路,2是通路。

#include <bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn = 500 + 10;
int ans,d[maxn],n,m,pre[maxn];
int findr(int x)
{
return pre[x] == x ? pre[x] : pre[x] = findr(pre[x]);
}
void unio(int x,int y)
{
int fx = findr(x),fy = findr(y);
if(fx != fy){
pre[fx] = fy;
}
}
int main()
{
while(~scanf("%d%d",&n,&m)){
for( int i = 1; i <= n; i++ )pre[i] = i;
for( int i = 0; i < m; i++ ){
int u,v;
scanf("%d%d",&u,&v);
unio(u,v);
d[u]++,d[v]++;
}
int odd = 0,flag = 0,root = findr(1);
for( int i = 1; i <= n; i++ ){
if(d[i] & 1)odd++;
if(findr(i) != root)flag = 1;
printf("%d%c",d[i],i!=n?' ':'\n');
}
if(flag){puts("Non-Eulerian");return 0;}
if(odd != 0 && odd != 2)puts("Non-Eulerian");
else {
if(odd == 2)puts("Semi-Eulerian");
else puts("Eulerian");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pat cccc-gplt 图论