L2-023 图着色问题 (25 分)

L2-023 图着色问题 (25 分)
图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?
【L2-023 图着色问题 (25 分)】但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。
输入格式:
输入在第一行给出3个整数V(0 输出格式:
对每种颜色分配方案,如果是图着色问题的一个解则输出Yes,否则输出No,每句占一行。
输入样例:

6 8 3 2 1 1 3 4 6 2 5 2 4 5 4 5 6 3 6 4 1 2 3 3 1 2 4 5 6 6 4 5 1 2 3 4 5 6 2 3 4 2 3 4

输出样例:
Yes Yes No No

//本题在题目中明确顶点数与颜色数不会大于500,但是并没有给出边数的上限; #include using namespace std; typedef struct{ int add; int add2; }T; T a[1000005]; //最后一个测试点边数很大,而数组a跟边数m的关系是线性的,故数组a的空间要给足,否则会数组越界发生段错误 int b[505]; int main(){ set pp; int n,m,p; cin>>n>>m>>p; int o,op; for(int i=1; i<=m; ++i){ scanf("%d %d",&o,&op); a[i].add=o; a[i].add2=op; } int l; cin>>l; int flag; for(int i=0; i!=l; ++i){ flag=0; for(int j=1; j<=n; ++j){ scanf("%d",&o); pp.insert(o); b[j]=o; } if(pp.size()==p){ for(int j=1; j<=m; ++j){ if(b[a[j].add]==b[a[j].add2]){ printf("No\n"); flag=1; break; } } if(!flag) printf("Yes\n"); } else printf("No\n"); for(int j=1; j<=n; ++j) b[j]=0; pp.clear(); } }


    推荐阅读