UVA 10054 The Necklace -欧拉回路
2018-01-08 10:05
435 查看
链接:10054
把每个珠子看作一条无向边,把珠子串在一起,符合条件的串法实际是一条欧拉回路。
欧拉路径和欧拉回路的区别是是否存在奇点,只需要事先判断一下是否存在奇点,然后就根据求欧拉路径的算法在线性时间内得到欧拉回路,如果路径上边的数量和测试数据中边的数量相等,就能串成一串,也就是考虑图的连通情况
需要注意的是,因为可以有很多相同的珠子,所以部分边可以访问多次。
把每个珠子看作一条无向边,把珠子串在一起,符合条件的串法实际是一条欧拉回路。
欧拉路径和欧拉回路的区别是是否存在奇点,只需要事先判断一下是否存在奇点,然后就根据求欧拉路径的算法在线性时间内得到欧拉回路,如果路径上边的数量和测试数据中边的数量相等,就能串成一串,也就是考虑图的连通情况
需要注意的是,因为可以有很多相同的珠子,所以部分边可以访问多次。
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> pii; const int maxN=55; int maps[maxN][maxN]; int N; int& num(int a,int b){ if(a>b){ a+=b; b=a-b; a=a-b; } return maps[a][b]; } void euler(int here,stack<pii>& ans){ for(int i=1;i<=50;i++){ if(num(here,i)>0){ num(here,i)--; euler(i,ans); ans.push(pii(here,i)); } } } int main(){ int t,a,b,c,d; int e[maxN]; cin>>t; for(int i=1;i<=t;i++){ if(i>1)cout<<endl; memset(maps,0,sizeof(maps)); memset(e,0,sizeof(e)); cin>>N; cin>>a>>b;num(a,b)++; c=a;d=b;e[a]++;e[b]++; for(int i=1;i<N;i++){ cin>>a>>b; num(a,b)++; e[a]++;e[b]++; } bool flag=0; for(int i=1;i<=50;i++)if(e[i]&1)flag=1; cout<<"Case #"<<i<<endl; if(flag){ cout<<"some beads may be lost"<<endl; continue; } else{ stack<pii> ans; euler(c,ans); if(ans.size()<N)cout<<"some beads may be lost"<<endl; else{ while(!ans.empty()){ cout<<ans.top().first<<" "<<ans.top().second<<endl; ans.pop(); } } } } }
相关文章推荐
- UVa10054 - The Necklace(欧拉回路【输出带来的麻烦)
- 【UVa10054】The Necklace【欧拉回路】
- uva 10054 The Necklace (欧拉回路)
- UVA 10054 - The Necklace 欧拉回路
- uva 10054 The Necklace(欧拉回路)
- UVa 10054 - The Necklace 欧拉回路
- UVA 10054 - The Necklace 欧拉回路
- UVA-10054 The Necklace (欧拉回路)
- [UVA 10054]The Necklace[欧拉回路][打印路径]
- uva 10054 The Necklace(欧拉回路)
- UVA10054 The Necklace(欧拉回路)
- uva_10054_The Necklace(欧拉回路+打印路径)
- UVA - 10054 The Necklace (欧拉回路)
- UVA 10054 The Necklace (无向图的欧拉回路)
- uva10054 The Necklace (欧拉回路路径输出 (并查集 + DFS) || (DFS + stack))
- UVA 10054 The Necklace(欧拉回路)
- The Necklace ——UVA - 10054(欧拉回路)
- UVA-10054 The Necklace 欧拉回路
- UVA 10054 The Necklace(欧拉回路,打印路径)
- UVA 10054 The Necklace (dfs欧拉回路)