UVA 10054 The Necklace
完全就是哭瞎的节奏···QAQ
又是图论···
题意:有一种项链,每个珠子上有两种颜色,相同颜色的两颗珠子的两头相连,如果能连成环输出珠子的顺序,不能连成环输出"some beads may be lost"。

解法:DFS。将颜色看做点,珠子看做边,转化为欧拉回路问题。欧拉回路每个点的入度和出度和都是偶数。对颜色做DFS。加上回溯会T,不加度数判断会WA……
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define ll long long
using namespace std;
int color[55][55];//记录不同颜色珠子的个数
int n;
struct node
{
int a,b;
node(int a,int b): a(a),b(b) {}
};//珠子
vector<node> v;//项链的序列
void dfs(int c)
{
for(int i=1; i<55; i++)
{
if(color[c][i])
{
color[c][i]--;
color[i][c]--;
dfs(i);
v.push_back(node(c,i));
}
}
return ;
}
int main()
{
int t;
scanf("%d",&t);
for(int cnt=1; cnt<=t; cnt++)
{
v.clear();
int a,b;
memset(color,0,sizeof(color));
int d[55]= {0};//度数
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d%d",&a,&b);
color[a][b]++;
color[b][a]++;//一个珠子可以表示两种珠子
d[a]++;
d[b]++;
}
int flag=1;
for(int i=0; i<55; i++)
{
if(d[i]&1)
{
flag=0;
break;
}
}//度数判断
printf("Case #%d\n",cnt);
if(flag)
{
dfs(a);
if(!(n==v.size()&&v[0].b==v[v.size()-1].a))//判断首尾是否可以相连
flag=0;
}
if(flag)
for(int i=v.size()-1; i>=0; i--)
printf("%d %d\n",v[i].a,v[i].b);
else
puts("some beads may be lost");
if(cnt<t)
puts("");
}
return 0;
}

浙公网安备 33010602011771号