题目链接~~>
欧拉道路:从图中的一个结点出发走出一条道路,每条边恰好经过一次(不一定回到出发点)。条件:连通且含有两个奇点。
欧拉回路:从图中的一个结点出发走出一条道路,每条边恰好经过一次,且最终又回到出发点。条件:连通且含有零个奇点。
打印道路代码:
#include<stdio.h> int map[102][102]; int n; void euler(int u) { for(int v=1;v<=n;v++) if(map[u][v]) { map[u][v]=map[v][u]=0;//无向图 //map[u][v]=0; 有向图 printf("~%d %d",u,v); euler(v); } } int main() { int T,m,i,x,y; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(map,0,sizeof(map)); for(i=0;i<m;i++) { scanf("%d%d",&x,&y); map[x][y]=map[y][x]=1;//无向图 //map[x][y]=1; 有向图 } euler(1);//如果欧拉回路可以传任意一个点,否则传奇数点 } }
代码(NOJ 一笔画):
#include<stdio.h> #include<string.h> int n; int vis[1002],father[1002]; int find(int x)//寻找父亲 { if(father[x]!=x) x=find(father[x]); return x ; } int main() { int T,i,m,x,y,fx,fy; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); int q=0; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) father[i]=i; for(i=0;i<m;i++) { scanf("%d%d",&x,&y); vis[x]++;vis[y]++;//判断是奇点还是偶点 fx=find(x);fy=find(y); if(fx!=fy)//判断图是否连通 { father[fx]=fy; q++; } } if(q<n-1) { printf("No\n"); continue; } int fg=0; for(i=1;i<=n;i++) if(vis[i]%2) fg++; if(fg>2) printf("No\n"); else printf("Yes\n"); } return 0; }