POJ1129暴力,处理输入,简单四色,正常四色
四色定理,一个一个遍历就行,挺简单,但超时,震惊
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
const int maxnum=27;
bool array[maxnum][maxnum];
int num;
void fuction()
{
int i,j,k,l;
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
for(k=1;k<=num;k++)
for(l=1;l<=num;l++)
if(array[i][j]&&array[i][k]&&array[i][l]&&array[j][k]&&array[j][l]&&array[k][l])
{
printf("4 channels needed.\n");
return ;
}
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
for(k=1;k<=num;k++)
if(array[i][j]&& array[i][k]&&array[j][k])
{
printf("3 channels needed.\n");
return;
}
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
if(array[i][j])
{
printf("2 channels needed.\n");
return;
}
printf("1 channel needed.\n");
}
int main()
{
int i;
bool flag;
char ch,tch;
while(scanf("%d",&num)!=EOF)
{
if(num==0) break;
memset(array,false,sizeof(array));
flag=false;
getchar();
for(i=0;i<num;i++)
{
scanf("%c%c",&ch,&tch);
int a=ch-'A'+1;
while(scanf("%c",&ch)!=EOF)
{
if(ch=='\n') break;
int b=ch-'A'+1;
array[a][b]=true;
array[b][a]=true;
}
}
fuction();
}
return 0;
}
简单四色
#include<iostream>
#include<cstdio>
using namespace std;
struct nod
{
int t[27],s;
}node[27];
int n;
int main()
{
while (cin>>n)
{
if (!n) break;
getchar();
for (int i=1;i<=n;i++)
{
char ch;
ch=getchar();
getchar();
node[i].s = 0;
while ((ch = getchar() )!='\n')
{
int j = ch - 'A'+1;
node[i].t[++node[i].s] = j;
}
}
int color[27] = {0};
color[1] = 1;//节点i的颜色
int sumcolor = 1;
for (int i=2;i<=n;i++)
{
bool vis[27] = {false};
color[i] =i + 1;
for (int j = 1;j<=node[i].s;j++)//枚举后继,后继已经染色,那么这种颜色不可用
if (color[j])
vis[color[j]] = true;
for (int k=1;k<=sumcolor+1;k++)
if (!vis[k] && k<color[i])
{
color[i] = k;
break;
}
if (color[i]>sumcolor) sumcolor = color[i];
}
printf("%d ",sumcolor);
if (sumcolor>1) printf("channels needed.\n");
else printf("channel needed.\n");
}
}
正常的,这儿讲的详细