sgu121 分类: sgu 2015-02-15 11:23 69人阅读 评论(0) 收藏
构造题
先对每个度为奇数的点的边交替染色
再对每个度为偶数的点的边交替染色
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define MAXN 105
#define White 1
#define Black 2
#define trans(x) (3-x)
int n;
int d[MAXN]={0};
int b[MAXN][MAXN]={0};
bool mp[MAXN][MAXN]={false};
short color[MAXN][MAXN]={false};
void dfs(int a,short co)
{
int i;
co=trans(co);
for(i=1;i<=n;i++)
if(mp[a][i]==true && color[a][i]==false)
{
color[a][i]=color[i][a]=co;
dfs(i,co);
co=trans(co);
}
}
int main()
{
int i,j,tmp;
#ifndef ONLINE_JUDGE
freopen("sgu121.in","r",stdin);
freopen("sgu121.out","w",stdout);
#endif
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j;j++)
{
scanf("%d",&b[i][j]);
if(!b[i][j])break;
d[i]++,d[b[i][j]]++;
mp[i][b[i][j]]=true;
}
}
for(i=1;i<=n;i++)d[i]>>=1;
for(i=1;i<=n;i++)
if(d[i]&1)dfs(i,White);
for(i=1;i<=n;i++)
dfs(i,White);
for(i=1;i<=n;i++)
{
tmp=0;
for(j=1;j<=n;j++)
tmp|=color[i][j];
if(d[i]>=2 && tmp!=White+Black)
break;
}
if(i==n+1)
{
for(i=1;i<=n;i++)
{
for(j=1;j;j++)
{
if(!b[i][j])break;
printf("%d ",color[i][b[i][j]]);
}
printf("0\n");
}
}
else
printf("No solution");
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。