NYOJ+一笔画问题+先要判断无向图的连通性(DFS or并查集),然后使用欧拉回路。
2016-03-05 23:53
330 查看
点击打开链接
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<math.h> #include<cstdio> using namespace std; int bian[1010]; bool Map[1010][1010],vis[1010]; int P,Q; ///主要是先判断图的连通性,之后再使用欧拉回路。 void dfs(int cur) { vis[cur]=true; for(int i=1;i<=P;i++){///像进栈一样额。 if(Map[cur][i]){ bian[cur]++; if(!vis[i]){///判断是否访问过,防止重复访问额。 dfs(i); } } } } int main() { int N=0,num=0,i=0,A=0,B=0,ok=0; scanf("%d",&N); while(N--){ scanf("%d%d",&P,&Q); ok=0; memset(Map,false,sizeof(Map)); memset(vis,false,sizeof(vis)); memset(bian,0,sizeof(bian)); memset(vis,0,sizeof(vis)); for(i=0;i<Q;i++){ scanf("%d%d",&A,&B); Map[A][B]=Map[B][A]=true; } dfs(1); for(i=1;i<=P;i++){ if(!vis[i]){ ok=1; break; } } if(ok)printf("No\n"); else{ num=0; for(i=1;i<=P;i++){ if(bian[i]%2){ num++; } } if(num==0||num==2)printf("Yes\n"); else printf("No\n"); } } return 0; }
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<math.h> #include<cstdio> using namespace std; int pre[1010],bian[1010]; int P,Q; void init() { int i=0; for(i=0;i<=P;i++){ pre[i]=i; } } int Find(int x) { int root=x; while(pre[root]!=root){///找到节点的根 root=pre[root]; } int cur=x,tmp; while(cur!=root){///修改从该节点到根节点的所有节点的父亲为root. tmp=pre[cur]; pre[cur]=root; cur=tmp; } return root; } void Union(int x,int y) { int fx=Find(x); int fy=Find(y); if(fx!=fy){ pre[fx]=fy;///这里弄完之后会下次使用find会再一次路径压缩的。 } } int main() { int N=0,num=0,A=0,B=0,i=0,Count=0; scanf("%d",&N); while(N--){ init(); Count=0;num=0; memset(bian,0,sizeof(bian)); scanf("%d%d",&P,&Q); for(i=0;i<Q;i++){ scanf("%d%d",&A,&B); bian[A]++;bian[B]++; Union(A,B); } for(i=1;i<=P;i++){ if(Find(i)==i){ Count++; } if(bian[i]%2){ num++; } } ///printf("%d %d\n",num,Count); if((num==0||num==2)&&Count==1){ printf("Yes\n"); } else{ printf("No\n"); } } return 0; }