您的位置:首页 > 其它

nyoj42 一笔画问题【欧拉图(模板)】

2017-04-06 21:53 337 查看
无向图存在欧拉回路的充要条件

当且仅当这个图的所有顶点的度数是偶数,且该图是连通图。

无向图含有欧拉通路的充要条件

当且仅当这个图有零个或两个奇数度的结点,且该图是连通图。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int head[1010],tol,pre[1010],fa[1010];
int n,m;

int Find(int x){
int r=x;
while(fa[r]!=r)
r=fa[r];
int i=x,j;
while(fa[i]!=r){
j=fa[i];
fa[i]=r;
i=j;
}
return r;
}

void init(){
for(int i=1;i<=n;i++) fa[i]=i;
memset(pre,0,sizeof(pre));
}
bool Judge(){
int num=0;
for(int i=1;i<=n;i++){
if(pre[i]&1)
num++;
if(num>2) return false;
}
if(num!=2 && num!=0) return false;
num=0;
for(int i=1;i<=n;i++){
if(fa[i]==i) num++;
if(num>1) return false;
}
return true;
}

int main()
{
int T,u,v;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
init();
while(m--){
scanf("%d%d",&u,&v);
int x=Find(u);
int y=Find(v);
if(fa[x]!=y) fa[x]=y;
pre[u]++;
pre[v]++;
}
if(!Judge()){
puts("No");
continue;
}
puts("Yes");
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: