SGU 101 Domino【欧拉】
给你一些骨牌。。看能不能一笔走完~赤裸裸的欧拉~
代码:
SGU101
1 #include<cstdio> 2 #include<cstring> 3 4 const int maxn=110; 5 6 struct Edge{ 7 int to,next; 8 }; 9 Edge edge[maxn],tol[maxn]; 10 int Map[10][10]; 11 int etot; 12 int exist[10]; 13 14 void Eular_dfs(int idx){ 15 for(int i=0;i<7;i++){ 16 if(Map[idx][i]){ 17 Map[idx][i]--,Map[i][idx]--; 18 Eular_dfs(i); 19 edge[++etot].to=idx,edge[etot].next=i;//相当于一个堆栈 20 } 21 } 22 } 23 24 int main(){ 25 int n,i,tot=0,u,v; 26 scanf("%d",&n); 27 for(i=1,etot=0;i<=n;i++){ 28 scanf("%d%d",&u,&v); 29 exist[u]++,exist[v]++; 30 Map[u][v]++,Map[v][u]++; 31 tol[i].to=u,tol[i].next=v; 32 } 33 int odd=0,st=0; 34 for(i=0;i<7;i++){ 35 if(exist[i]&1) odd++,st=i; 36 else if(exist[i]&&!st) st=i; 37 } 38 if(odd && odd!=2){puts("No solution");return 0;}/* 39 for(i=0;i<7;i++){//输出Map 40 for(v=0;v<7;v++) printf("%d ",Map[i][v]); 41 puts(""); 42 }*/ 43 Eular_dfs(st); 44 if(etot<n){puts("No solution");return 0;}//不能一笔走完 45 for(i=etot;i>=0;i--)//输出的时候暴力~ 46 for(v=1;v<=n;v++){ 47 if(edge[i].to==tol[v].to && edge[i].next==tol[v].next){ 48 printf("%d +\n",v),tol[v].to=-1; 49 break; 50 }else if(edge[i].next==tol[v].to && edge[i].to==tol[v].next){ 51 printf("%d -\n",v),tol[v].to=-1; 52 break; 53 } 54 } 55 return 0; 56 }


浙公网安备 33010602011771号