您的位置:首页 > 其它

寒假集训 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: