标签:
#include<iostream> #include<algorithm> using namespace std; struct sticktype { int l; int r; bool vis; }stick[101]; struct pointtype { int amount; int next[7]; bool vis; }point[7]; int tail=0; int queue[201]; void dfs(int p); int main() { int n; cin>>n; for(int i=0;i<=6;i++) { point[i].amount=0; for(int j=0;j<=6;j++) { point[i].next[j]=0; } } for(int i=1;i<=n;i++) { cin>>stick[i].l>>stick[i].r; stick[i].vis=false; point[stick[i].l].vis=false; point[stick[i].r].vis=false; point[stick[i].l].amount++; point[stick[i].l].next[stick[i].r]+=1; point[stick[i].r].amount++; point[stick[i].r].next[stick[i].l]+=1; } int m=0; int res=0; for(int i=0;i<=6;i++) { if(point[i].amount!=0) { m++; if(point[i].amount%2!=0) { res++; } } } if(res!=0&&res!=2) { cout<<"No solution"; return 0; } int begin; if(res==0) { for(int i=0;i<=6;i++) { if(point[i].amount!=0) { begin=i; break; } } } else { for(int i=0;i<=6;i++) { if(point[i].amount%2!=0) { begin=i; break; } } } dfs(begin); for(int i=0;i<=6;i++) { if(!point[i].vis&&point[i].amount!=0) { cout<<"No solution"; return 0; } } for(int i=tail;i>=2;i--) { for(int j=1;j<=n;j++) { if(!stick[j].vis) { if(stick[j].l==queue[i-1]&&stick[j].r==queue[i]) { stick[j].vis=true; cout<<j<<" -"<<endl; break; } if(stick[j].r==queue[i-1]&&stick[j].l==queue[i]) { stick[j].vis=true; cout<<j<<" +"<<endl; break; } } } } return 0; } bool check(int p) { for(int i=0;i<=6;i++) { if(point[p].next[i]) { return false; } } return true; } void dfs(int p) { point[p].vis=true; for(int i=0;i<=6;i++) { while(point[p].next[i]) { point[p].next[i]--; int next_point=i; point[next_point].next[p]--; dfs(next_point); } } if(check(p)) { tail++; queue[tail]=p; } return; }
SGU 101 为欧拉路径问题
欧拉路径定义是图上的一条路径,满足经过每一条边正好一次
欧拉路径在无向图存在欧拉路径的充要条件是度为奇数的顶点数为0或2且图为连通图
算法细节如下:
读入边的数据,用sticktype存储,用vis标记解决输出时候的重复问题
对于每一条边看做无向边,对于每一个顶点,其相邻顶点用next数组标记,因为顶点数少,且出现重边情况,所以用计数方法存储,amount存储顶点的度,vis标记用于判断图的连通性
判断特殊情况后,深搜遍历边,对于当前搜索到的顶点,枚举每一条与之相邻的边,将该边删除,并搜索该边的另一个顶点,如果相邻的边都被遍历过,将该顶点放入队列并回溯。
搜索完成后,生成的队列为欧拉路径的逆序,根据序列找到相应的边,判断方向,输出即可
一定要注意判断图的连通性,我为这个卡了一整天!!!
标签:
原文地址:http://www.cnblogs.com/shao0099876/p/5700276.html