**
【中山纪念中学信息学竞赛2010测试赛】四色定理
(File IO): input:c.in output:c.out
**
题目描述
著名的四色定理你一定听说过吧?这可是近代世界三大数学难题之一唷(顺便提上一句,另外两个是费马定理和哥德马赫猜想)。
四色定理的提出来自英国。1852年,毕业于伦敦大学的弗南西斯·格思里(Francis Guthrie)在一家科研单位搞地图着色工作时,发现了一种有趣的现象:“看来,每幅地图都可以用四种颜色着色,使得有共同边界的国家着上不同的颜色。”(注意:只要求有公共边的区域不同色就可以,只有公共顶点的同色也没关系)
这个结论能不能从数学上加以严格证明呢?他和在大学读书的弟弟格里斯决心试一试。兄弟二人为证明这一问题而使用的稿纸已经堆了一大叠,可是研究工作没有进展。
1852年10月23日,他的弟弟就这个问题的证明请教他的老师、著名数学家德·摩尔根,摩尔根也没有能找到解决这个问题的途径,于是写信向自己的好友、著名数学家哈密尔顿爵士请教。哈密尔顿接到摩尔根的信后,对四色问题进行论证。但直到1865年哈密尔顿逝世为止,问题也没有能够解决。
直到1976年,在J. Koch的算法的支持下,美国数学家阿佩尔(Kenneth Appel)与哈肯(Wolfgang Haken)在美国伊利诺斯大学的两台不同的电子计算机上,用了1200个小时,作了100亿判断,才终于完成了四色定理的证明。
你的任务相对那些数学家们来说当然要容易得多:你只要编写一个程序,计算一下在给定的一张有5个区域的地图上,用四种颜色填充不同区域,并保证有公共边的区域不同色的方案数有多少就可以了。
输入
文件第一行是一个整数 n(0<=n<=10),分别表示地图中有公共边的区域的信息数量。
下面n行,每行一对整数,表示对所有区域编号之后,此两个编号的区域是有公共边的。
输出
文件中只有一个整数,表示用四种颜色填充地图的总方案数。注意,在某些方案中,所有四种颜色不必都用到。
样例输入
4
1 2
1 3
1 4
1 5
样例输出
324
提示:
一开始的思路:这道题是排列组合,先确定一块的颜色,然后去推另外几个点…
后来的思路:哦,是深搜啊!
是深搜啊!!!!!!
思路:
普通的深搜,只不过函数里面写的是二重循环,外面写颜色个数,里面写染色区域。
上代码!
#include<bits/stdc++.h>
using namespace std;
int n,a[10000],b[10000],ans,x[1000],c[1000][1000],o[5],vis[1000];
void dg(int w){
if(w==6){
ans++;
return ;
}
for(int i=1;i<=4;i++){
int temp=0;
for(int j=1;j<=5;j++){
if(c[w][j]==1&&vis[j]==i){
temp=1;
break;
}
}
if(temp==1) continue;
else{
vis[w]=i;
dg(w+1);
vis[w]=0;
}
}
}
int main(){
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
c[a[i]][b[i]]=1;
c[b[i]][a[i]]=1;
}
dg(1);
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
制作不易,求心心~~
(你们还想看神马题,在评论去说出来嗷!别太难我可是小学生!!!)
下期预告: