开始还在考虑离散老师说的,先按照度来进行排序,然后先访问度高的依次往下访问(进行搜索),然后发现他们都直接遍历的就可以了。需要注意的是,当channel为1时,为channel,当channel为2时,为channels,请注意。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 28;
int n;
bool vis[N];
bool map[N][N];
void dfs(int i)
{
int queue[N];
int ind = 1;
queue[1] = i;
for(int e=i+1;e<=n;++e)
if(!vis[e]&&!map[i][e])
{
bool flag = false;
for(int j=1;j<=ind;++j)
if(map[queue[j]][e])
{
flag = true;
break;
}
if(!flag)
{
queue[++ind] = e;
vis[e] = true;
}
}
}
int main(void)
{
while(scanf("%d",&n),n!=0)
{
memset(vis,false,sizeof(vis));
memset(map,false,sizeof(map));
char str[20];
for(int i=1;i<=n;++i)
{
scanf("%s",str);
for(int j=0;str[j]!='\0';++j)
{
map[i][str[j]-'A'+1] = true;
}
}
int channel = 0;
for(int i=1;i<=n;++i)
if(!vis[i])
{
vis[i] = true;
dfs(i);
++channel;
}
if(channel==1)
cout<<channel<<" channel needed."<<endl;
else
cout<<channel<<" channels needed."<<endl;
}
return 0;
}