1. 程式人生 > >四色定理

四色定理

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");
    }
}

正常的,這兒講的詳細

這兒