題目大意:
有n顆珠子。每個珠子有兩種顏色,分佈在珠子的兩邊。一共有50種顏色,用數字1-50表示顏色,把這些珠子串起來成爲一個圓。要求相鄰的珠子接觸的部分顏色相同。問是否能夠連成一串項鍊。如果能,打印一種連法。
每次寫題,請把題目理解透徹,避免做無用功。
題目解析:
- 因爲是連成圓,所以如果有一種顏色是奇數個,就連不成項鍊。
- 如果是偶數個一定能夠連成歐拉回路。
- 注意可能有重邊
#include<iostream>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int N=1000+5;
int degree[N],G[N][N];
//DFS輸出歐拉回路
void euler(int u){
int v;
for(v=1;v<=50;v++){
if(G[u][v]){
G[u][v]--;G[v][u]--;
euler(v);//遞歸實現
printf("%d %d\n",v,u); //逆序輸出
}
}
}
int main(){
int T,n,u,v;
cin >>T;
for(int k=1;k<=T;k++){
memset(degree,0,sizeof(degree));
memset(G,0,sizeof(G));
cin >>n;
for(int i=0;i<n;i++){
scanf("%d%d",&u,&v);
//存入點的個數
degree[u]++;
degree[v]++;
G[u][v]++;
G[v][u]++;
}
//如果有一個顏色的點數是奇數個歐拉回路就不存在
bool fag=true;
for(int i=1;i<=50;i++){
if(degree[i]%2==1){
fag=false;
break;
}
}
if(!fag)
printf("Case #%d\nsome beads may be lost\n",k);
else{
printf("Case #%d\n",k);
//for(int i=1;i<=50;i++)
euler(u);
}
if(k!=T)
printf("\n");
}
return 0;
}