四色定理
阿新 • • 發佈:2018-12-31
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"); } }
正常的,這兒講的詳細