题目链接:
http://poj.org/problem?id=1129
题意:
输入一个无向图,求最少几种颜色可以将其相邻节点间颜色不同。
A:BC表示点A连B C.
题解:
根据四色原则暴搜。
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
vector<int>lin[30];
int n,tot,ans,cl[30];
char s[30];
void dfs(int now)
{
for (int i=1;i<=4;i++)
{
int flag=0;
for (int j=0;j<lin[now].size();j++)
if (cl[lin[now][j]]==i)
{flag=1;break;}
if (flag==0)
{cl[now]=i;break;}
}
for (int i=0;i<lin[now].size();i++)
if (!cl[lin[now][i]])
dfs(lin[now][i]);
return ;
}
int main()
{
while(scanf("%d",&n))
{
if (n==0) return 0;
ans=-1;
memset(cl,0,sizeof(cl));
for (int i=1;i<=n;i++)
lin[i].clear();
for (int i=1;i<=n;i++)
{
scanf("%s",s);
int len=strlen(s);
int now=s[0]-'A'+1;
// cout<<now<<endl;
for (int j=2;j<len;j++)
{
int nex=s[j]-'A'+1;
lin[now].push_back(nex);
// cout<<nex<<' ';
}
// cout<<endl;
}
// cout<<"hfh"<<endl;
for (int i=1;i<=n;i++)
if (!cl[i]) dfs(i);
for (int i=1;i<=n;i++)
ans=max(cl[i],ans);
if (ans<=1)
printf("%d channel needed.\n",ans);
else
printf("%d channels needed.\n",ans);
}
}