7-1 图着色问题(25 分)

来源:互联网 发布:经济结构优化 编辑:程序博客网 时间:2024/05/02 05:04

图着色问题是一个著名的NP完全问题。给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?

但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。

输入格式:

输入在第一行给出3个整数V0)、E)和K0),分别是无向图的顶点数、边数、以及颜色数。顶点和颜色都从1到V编号。随后E行,每行给出一条边的两个端点的编号。在图的信息给出之后,给出了一个正整数N),是待检查的颜色分配方案的个数。随后N行,每行顺次给出V个顶点的颜色(第i个数字表示第i个顶点的颜色),数字间以空格分隔。题目保证给定的无向图是合法的(即不存在自回路和重边)。

输出格式:

对每种颜色分配方案,如果是图着色问题的一个解则输出Yes,否则输出No,每句占一行。

输入样例:

6 8 32 11 34 62 52 45 45 63 641 2 3 3 1 24 5 6 6 4 51 2 3 4 5 62 3 4 2 3 4

输出样例:

YesYesNoNo

我的代码(C++):

#include<iostream>#include<memory.h>using namespace std;struct Graph{int a[501][501];int v,e;};int z,visited[501]={0},d[501],k=0,n,i,j;Graph *creat(){Graph *g=new Graph;int x,y,i;memset(g->a,0,sizeof(g->a));cin>>g->v>>g->e>>z;for(i=0;i<g->e;i++){cin>>x>>y;g->a[x][y]=g->a[y][x]=1;}return g;}void dfs(Graph *g,int i){int j;d[k++]=i;visited[i]=1;for(j=1;j<=g->v;j++){if(g->a[i][j]==1 && visited[j]==0) dfs(g,j);}}void dfs1(Graph *g){int i;for(i=1;i<=g->v;i++){if(visited[i]==0) dfs(g,i);}}int main(){Graph *g=creat();dfs1(g);cin>>n;while(n--){int b[501]={0},c[501],e[501],sum=0,flag=1;for(i=1;i<=g->v;i++){cin>>c[i];b[c[i]]++;if(b[c[i]]==1) sum++;}if(sum!=z) flag=0;for(i=0;i<k;i++) e[i]=c[d[i]];for(i=0;i<k;i++){for(j=0;j<k;j++){if(g->a[d[i]][d[j]]==1 && e[i]==e[j]){flag=0;break;}}if(flag==0) break;}if(flag==0) puts("No");else puts("Yes");}return 0;}

我的代码(Java):

(用Java写有可能会运行超时)

import java.util.Scanner;public class Main {private static int v,e,visited[]=new int[501],d[]=new int[501];private static int z,a[][]=new int[501][501],k=0;public static void dfs(int i){d[k++]=i;visited[i]=1;for(int j=1;j<=v;j++){if(a[i][j]==1 && visited[j]==0) dfs(j);}}public static void dfs1(){for(int i=1;i<=v;i++){if(visited[i]==0) dfs(i);}}public static void main(String[] args) {Scanner In=new Scanner(System.in);v=In.nextInt();e=In.nextInt();z=In.nextInt();int a[][]=new int[501][501];for(int i=0;i<e;i++){int x=In.nextInt(),y=In.nextInt();a[x][y]=a[y][x]=1;}dfs1();int n=In.nextInt();for(int i=0;i<n;i++){int b[]=new int[501],c[]=new int[501],e[]=new int[501];int sum=0,flag=1;for(int j=1;j<=v;j++){c[j]=In.nextInt();b[c[j]]++;if(b[c[j]]==1) sum++;}if(sum!=z) flag=0;for(int j=0;j<k;j++) e[j]=c[d[j]];for(int j=0;j<k;j++){for(int r=0;r<k;r++){if(a[d[j]][d[r]]==1 && e[j]==e[r]){flag=0;break;}}if(flag==0) break;}if(flag==0) System.out.printf("No\n");else System.out.printf("Yes\n");}}}

我的代码(C语言):

#include<stdio.h>int visited[501]={0},d[501],k=0;int a[501][501],v,e,z,x,y,i,j,n;void dfs(int i){int j;d[k++]=i;visited[i]=1;for(j=1;j<=v;j++){if(a[i][j]==1 && visited[j]==0) dfs(j);}}void dfs1(){int i;for(i=1;i<=v;i++){if(visited[i]==0) dfs(i);}}int main(){scanf("%d%d%d",&v,&e,&z);for(i=0;i<e;i++){scanf("%d%d",&x,&y);a[x][y]=a[y][x]=1;}dfs1();scanf("%d",&n);while(n--){int b[501]={0},c[501],e[501],sum=0,flag=1;for(i=1;i<=v;i++){scanf("%d",&c[i]);b[c[i]]++;if(b[c[i]]==1) sum++;}if(sum!=z) flag=0;for(i=0;i<k;i++) e[i]=c[d[i]];for(i=0;i<k;i++){for(j=0;j<k;j++){if(a[d[i]][d[j]]==1 && e[i]==e[j]){flag=0;break;}}if(flag==0) break;}if(flag==0) puts("No");else puts("Yes");}return 0;}

原创粉丝点击