http://acm.hdu.edu.cn/showproblem.php?pid=1878
主要是好像下一道题就是求 欧拉回路的。。
用dfs判断连通性,或者用并查集都行。
还是研究生复试题,好水。。
看来我考研有希望了qwq
欧拉回路的条件。(就是一笔画问题啦)
① 无向图
一个连通块,所有顶点度数均为偶数。
② 有向图
所有顶点入度等于出度
欧拉通路(就是画完,并不是回路,但是要画完)
无向图
① 奇度顶点个数为0或者2个。
有向图
② 所有入度等于出度,或者只有两个不等于,一个入度大于出度1,一个入度小出度一个
混合图欧拉回路(不会,就像不会双调旅行商那样。。)
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+3;
int du[1004];
int fa[1004];
void init(){
for(int i=0;i<1004;i++)
fa[i]=i;
}
int find1(int a){
if(a==fa[a]) return a;
return fa[a]=find1(fa[a]);
}
void unite(int a,int b){
int x=find1(a);
int y=find1(b);
if(x!=y)
fa[a]=y;
return ;
}
int main()
{ int m,n,a,b;
while(~scanf("%d",&m)){
if(m==0)break;
scanf("%d",&n);
memset(du,0,sizeof(du));
init();
for(int i=0;i<n;i++){
scanf("%d%d",&a,&b);
unite(a,b);
du[a]++;du[b]++;
}
bool flag=true;
int sum=0;
for(int i=1;i<=m;i++){
if(fa[i]==i)
sum++;
}
if(sum>1) flag=false;
for(int i=1;i<=m;i++){
if(du[i]&1)
flag=false;
}
if(flag)
puts("1");
else
puts("0");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+3;
vector<int>G[maxn];
bool vis[maxn];
int du[maxn];
void dfs(int u){
vis[u]=true;
for(int i=0;i<G[u].size();i++){
int to=G[u][i];
if(!vis[to]){
dfs(to);
}
}
}
int main()
{ int m,n,a,b;
while(~scanf("%d",&m)){
if(m==0)break;
scanf("%d",&n);
for(int i=0;i<maxn;i++)
G[i].clear();
memset(vis,false,sizeof(vis));
memset(du,0,sizeof(du));
for(int i=0;i<n;i++){
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
du[a]++;du[b]++;
}
bool flag=true;
dfs(1);
for(int i=1;i<=m;i++){
if(!vis[i]) flag=false;
}
for(int i=1;i<=m;i++){
if(du[i]&1)
flag=false;
}
if(flag)
puts("1");
else
puts("0");
}
return 0;
}