uva 10054 The Necklace 欧拉回路
2015-05-12 15:55
411 查看
// uva 10054 The Necklace 欧拉回路 // 以颜色为节点,两种颜色互相连着有向边,然后跑一边欧拉回路就ok了 // 这题套了余老师模板书上的欧拉回路,然后就过了 // // 通过这题我了解到了,欧拉回路的基本思想 // 哎,继续练吧。。。 #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat> #include <climits> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iostream> #include <list> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <vector> #define ceil(a,b) (((a)+(b)-1)/(b)) #define endl '\n' #define gcd __gcd #define highBit(x) (1ULL<<(63-__builtin_clzll(x))) #define popCount __builtin_popcountll typedef long long ll; using namespace std; const int MOD = 1000000007; const long double PI = acos(-1.L); template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; } template<class T> inline T lowBit(const T& x) { return x&-x; } template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; } template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; } const int maxn = 1008; int adj[maxn]; struct node { int to; int next; }edges[maxn*4]; int n; int num; int mx; int cnt; vector<pair<int,int> > g[maxn]; int father[maxn]; bool vis[maxn*3]; vector<pair<int,int> > path; //void addedge(int u,int v){ // edges[num].to = v; // edges[num].next = adj[u]; // adj[u] = num++; //} void print(){ for (int i=1;i<=mx;i++){ for (int j=0;j<g[i].size();j++){ printf("%d ",g[i][j].second); } puts(""); } } int find(int x){ if (x==father[x]) return x; return father[x] = find(father[x]); } void init(){ scanf("%d",&n); int u,v; mx = 0; cnt = 0; for (int i=0;i<=60;i++) g[i].clear(); for (int i=0;i<n;i++){ scanf("%d%d",&u,&v); mx = max(mx,max(u,v)); g[u].push_back(make_pair(cnt++,v)); g[v].push_back(make_pair(cnt++,u)); // addedge(u,v); // addedge(v,u); } // printf("cnt= %d\n",cnt); for (int i=1;i<=60;i++) father[i] = i; for (int i=1;i<=mx;i++){ for (int j=0;j<g[i].size();j++) father[find(i)] = find(g[i][j].second); } } void dfs(int u){ for (int i=0;i<g[u].size();i++){ if (!vis[g[u][i].first]){ vis[g[u][i].first] = true; if (g[u][i].first&1){ vis[g[u][i].first-1] = true; }else { vis[g[u][i].first+1] = true; } dfs(g[u][i].second); // printf("%d %d\n",g[u][i].second,u); path.push_back(make_pair(u,g[u][i].second)); } } } bool geteula(){ int origin = -1; //print(); for (int i=1;i<=mx;i++) if (g[i].size()){ if (g[i].size()&1) return false; if (origin == -1 ) origin = i; if (find(i)!=find(origin)) return false; sort(g[i].begin(),g[i].end()); } path.clear(); memset(vis,0,sizeof(vis)); //vis[origin] = true; // printf("%d\n",origin); if (origin != -1) dfs(origin); reverse(path.begin(),path.end()); return true; } void solve(){ int flag = geteula(); // puts("333"); //printf("%d\n",flag); if (!flag){ printf("some beads may be lost\n"); }else { for (int i=0;i<path.size();i++) printf("%d %d\n",path[i].first,path[i].second); } } int main() { int t; //freopen("G:\\Code\\1.txt","r",stdin); scanf("%d",&t); int kase=0; while(t--){ if (kase) puts(""); printf("Case #%d\n",++kase); init(); // puts("111"); solve(); } return 0; }
相关文章推荐
- UVA10054 The Necklace (输出欧拉回路)
- uva_10054_The Necklace(欧拉回路+打印路径)
- UVA-10054 The Necklace 欧拉回路
- UVA 10054 The Necklace -欧拉回路
- UVA10054 The Necklace(欧拉回路)
- The Necklace UVA - 10054 题解(欧拉回路,路径输出)
- UVa10054 - The Necklace(欧拉回路【输出带来的麻烦)
- uva10054 The Necklace (欧拉回路路径输出 (并查集 + DFS) || (DFS + stack))
- 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 欧拉回路
- uva 10054 The Necklace 拼项链 欧拉回路基础应用
- uva 10054 The Necklace 欧拉回路ha
- uva 10054 The Necklace 欧拉回路
- uva 10054 The Necklace 拼项链 欧拉回路基础应用