回路条件:
1.所有点的度数必须为偶数。
2.图必须连通。
3.图必须首尾相接。
思路:先统计度数,度数全为偶数,则找任意一点一路搜下去,并将搜到的边保存,
如果最后保存的边不足n条,说明图不连通,如果是n条,判读是第一条和最后一条是否相接。
#include <iostream> #include <cstring> #include <vector> using namespace std; struct edge { int x,y; }; int a[55][55],du[55]; vector<edge> my; void jie(int u) //一路接下去,如果可以组成回路,肯定可以接出一条路径 { edge t; for(int v=1;v<=50;v++) if(a[u][v]) { a[u][v]--; a[v][u]--; t.x=u; t.y=v; my.push_back(t); jie(v); } } int main(int argc, char *argv[]) { int t,i,j,n,k=1,u,v; cin>>t; while(t--) { cin>>n; memset(a,0,sizeof(a)); memset(du,0,sizeof(du)); for(i=1;i<=n;i++) { cin>>u>>v; a[u][v]++; a[v][u]++; du[u]++; du[v]++; //统计度数 } int flag=1; for(i=1;i<=50;i++) {if(du[i]%2) flag=0; break;}//存在奇度数,肯定不能组成回路 if(flag) { my.clear(); jie(u); if(my.size()!=n||my[0].x!=my[n-1].y) flag=0; //图是否连通,并且首位相接 } if(k!=1) cout<<endl; cout<<"Case #"<<k<<endl; k++; if(!flag) cout<<"some beads may be lost"<<endl; else { for(i=0;i<my.size();i++) cout<<my[i].x<<" "<<my[i].y<<endl; } } return 0; }