搜索--01

题目大概:

多个路由器之间有很多线相连,相联的路由器之间信号不能一样,问最少有几种信号。

思路:

这其实是高中的染色问题。

在一个平面上有很多相接的图,每两个相接的图有不同的颜色,问最少可以用多少种颜色把图涂好。

这里有四色定理,就是最多是四种颜色。

那就好办了,从一种颜色开始循环,每次给定一定数量的颜色开始涂色,开始递归,从第一个开始涂,并自动判定与它相邻的是否和他同一颜色,是则结束,不是则继续,当颜色用完,还没涂完结束。当全部涂完,结束。

感想:

加上四色定理的深度搜索。

代码:

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int a[28][28];
int s[28];
int q,t,n;
int dfs(int k)
{if(k==n+1){t=1;return 0;}

 for(int j=1;j<=q;j++)
 {s[k]=j;
 int o=1;
 for(int i=1;i<k;i++)
 {
  if(a[k][i]&&s[k]==s[i])o=0;
 }
 if(o)dfs(k+1);
 }
return 0;
}


int main()
{
string m;
while(cin>>n)
{if(n==0)break;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{cin>>m;
for(int j=2;j<m.size();j++)
{a[m[0]-'A'+1][m[j]-'A'+1]==1;
a[m[j]-'A'+1][m[0]-'A'+1]=1;
}
}

t=0;
for(q=1;q<=3;q++)
{
    memset(s,0,sizeof(s));
dfs(1);
if(t)break;

}
if(q==1)cout<<q<<" channel needed."<<endl;
else cout<<q<<" channels needed."<<endl;
}
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值