POJ 1129
(1)思路:
要求每个相邻点的通道都不一样,要求所求的通道路径的数量最小。
所以求出最大团,让最大团的每个点上的颜色都不一样,其他点的颜色自然也可以不一样。
(2)代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 50;
int ans,mp[maxn][maxn],num[maxn],n;
bool dfs(int *a2,int len,int cnt){
if(len==0){
if(ans<cnt){
ans = cnt;
return true;
}
return false;
}
int tmp[maxn];
for(int i=0;i<len;i++){
if(cnt+len-i<=ans) return false;
if(cnt+num[a2[i]]<=ans) return false;
int k = 0;
for(int j=i+1;j<len;j++)
if(mp[a2[i]][a2[j]]==1) tmp[k++] = a2[j];
if(dfs(tmp,k,cnt+1)==true) return true;
}
return false;
}
int fun(){
ans = 0;
int a1[maxn];
for(int i=1;i<=26;i++){
int k = 0;
for(int j=1;j<=26;j++)
if(mp[i][j]==1) a1[k++] = j;
dfs(a1,k,1);
num[i] = ans;
}
return ans;
}
int main(void){
while(~scanf("%d",&n)&&n){
for(int i=1;i<=26;i++)
for(int j=1;j<=26;j++)
mp[i][j] = 0;
for(int i=1;i<=n;i++){
char ss[50];
scanf("%s",ss);
int x = ss[0]-'A'+1,len = strlen(ss);
for(int i=2;i<len;i++){
int y = ss[i]-'A'+1;
mp[x][y] = mp[y][x] = 1;
}
}
int res = fun();
printf("%d ",res);
if(res==1) printf("channel needed.\n");
else printf("channels needed.\n");
}
return 0;
}