寒假集训 Day 7 G题 UVA-10054 项链
2018-01-26 21:30
351 查看
UVA 10054 项链
题目大意:
给出 n 条端点涂色的边,问是否可以将相同颜色连接起来形成一个环。解题思路:
首先判断是否具有欧拉回路。如果不存在欧拉回路,输出““some beads may be lost” ; 如果有欧拉回路,找到一条欧拉回路并输出。
要注意存在重边的情况。
输出的时候要与得到结果的顺序反向输出。
AC代码:
#include<cstdio> #include<iostream> #include<vector> #include<cstring> #include<cmath> #include<algorithm> #include<limits.h> #define rep(i,l,p) for(int i=l; i<=p; i++) #define drep(i,p,l) for(int i=p; i>=l; i--) using namespace std; const int maxC = 55; int T,n; int G[maxC][maxC],deg[maxC]; struct edge{ int from,to; edge(int from, int to):from(from),to(to){} }; vector<edge> ans; void dfs(int u){ rep(v,1,maxC-2){ if ( G[u][v] >0 ){ G[u][v]--; G[v][u]--; dfs(v); ans.push_back(edge(u,v)); } } } int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&T); rep(z,1,T){ scanf("%d",&n); memset(G,0,sizeof(G)); memset(deg,0,sizeof(deg)); int u,v; rep(i,1,n){ scanf("%d%d",&u,&v);//bug 可能有重边 G[u][v]++; G[v][u]++; deg[u]++; deg[v]++; } bool flag = true; rep(i,1,maxC-2){ //bug maxC没减,越界了 if ( deg[i] % 2 != 0 ){ flag = false; break; } } if ( flag ){ ans.clear(); dfs(u); if ( ans.size() != n || ans[0].to != ans[ans.size()-1].from ){ flag = false; } } printf("Case #%d\n", z); if ( !flag ){ printf("some beads may be lost\n"); }else{ drep(i,ans.size()-1,0){//反向输出 printf("%d %d\n",ans[i].from,ans[i].to); } } if ( z< T) cout << endl; } return 0; }
相关文章推荐
- 寒假集训 Day 7 H题 UVALive - 3902 Network 网络
- 寒假集训Day 3 D题 Uva 1589 象棋
- 例题5.3 项链 UVa10054
- 【2018寒假集训Day 8】【并查集】并查集模板
- 欧拉回路(项链,UVA 10054)
- 寒假▪福州集训 Day 3
- 项链(uva 10054)
- UVa 10054 项链(The Necklace)__基本法(套圈法)_欧拉路_A_
- UVa 10054 项链(欧拉回路)
- 【2018寒假集训Day 1】【位运算】生成字符串
- [置顶] 【集训Day3 单调队列】【2018寒假集训Day 5更新】最大子序列和
- 【2018寒假集训Day 7】【最短路径】三种算法的模板
- UVA 10054 项链
- uva——10054——项链
- 【2018寒假集训Day 8】【最小生成树】Prim和Kruskal算法模板
- UVa 10054 项链
- 寒假集训 Day 7 E题 CodeForces 915C Permute Digits
- 寒假集训 Day 11 G题 孰先孰后 HDU 4857
- uva10054-The Necklace(项链)
- uva 10054 项链