在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。 能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学。欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡七桥问题,并证明了更为广泛的有关一笔画的三条结论,人们通常称之为欧拉定理。对于一个连通图,通常把从某结点出发一笔画成所经过的路线叫做欧拉路。人们又通常把一笔画成回到出发点的欧拉路叫做欧拉回路。具有欧拉回路的图叫做欧拉图。
你的任务是:对于给定的一组无向图数据,判断其是否成其为欧拉图?
如果无向图连通并且所有结点的度都是偶数,则存在欧拉回路,否则不存在。
#include<stdio.h> #include<stdlib.h> #include<string.h> int edge[1000][1000],vis[1000],degree[1000],n,e,sum;//degree存储每个结点的度数。sum存储DFS访问结点的个数 void DFS(int v) { int i; vis[v]=1; sum++; for(i=1;i<=n;i++) if(vis[i]==0&&edge[v][i]==1) DFS(i); } int main() { int i,t,x,y; scanf("%d",&t); while(t--) { //初始化 sum=0; memset(edge,0,sizeof(edge)); memset(vis,0,sizeof(vis)); memset(degree,0,sizeof(degree)); scanf("%d%d",&n,&e); //连接有联系的结点创建图并用degree存储每个结点的度数 for(i=0;i<e;i++) { scanf("%d%d",&x,&y); edge[x][y]=1; edge[y][x]=1; degree[x]++; degree[y]++; } //深度优先遍历记录访问结点个数 DFS(x); //检测结点度数是否都是偶数 for(i=1;i<=n;i++) if(degree[i]%2==1) break; //如果该图是连通图并且结点个数都是偶数则可以形成欧拉回路 if(i==n+1&&sum==n) printf("1\n"); else printf("0\n"); } return 0; }