解题思路:
1.构建二维数组graph模拟无向图的邻接矩阵,两点间有边记为1,无边记为0
2.用一维数组flag记录当前着色方案是否可行
3.统计方案中不同的颜色个数。如果大于指定颜色个数,则方案不可行;如果等于指定颜色个数,则检查是否有着色相同的顶点,看这两个点之间是否有边,如果有边则方案不可行,反之可行;
4.统计方案中不同的颜色个数的方法-C语言中没有集合的概念,无法利用集合统计不重复元素的个数,输入中给出的着色均为相邻数字,所以用着色方案中最大着色与最小着色的差值来代替不同的着色数
源代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX 501
int surplus(int a[],int n)
{
int i,m,t;
for(i=0;i<n-1;i++)
{
for(m=0;m<n-i-1;m++)
{
if(a[m]>a[m+1])
{
t=a[m];
a[m]=a[m+1];
a[m+1]=t;
}
}
}
return a[n-1]-a[0];
}
int main()
{
int v,e,k,n,v1,v2,graph[MAX][MAX]={0},color[21][MAX];//v-顶点数 e-边数 k-颜色数
int i,j,l,flag[MAX];//flag用于记录每种方案是否可行
scanf("%d %d %d",&v,&e,&k);
for(i=0;i<e;i++)
{
scanf("%d %d",&v1,&v2);
if(v1!=v2)
{
graph[v1-1][v2-1]=1;
graph[v2-1][v1-1]=1;
}
}
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<v;j++)
{
scanf("%d ",&color[i][j]);
}
}
for(i=0;i<n;i++)
{
flag[i]=1;
}
for(i=0;i<n;i++)
{
for(j=0;j<v;j++)
{
for(l=0;l<v;l++)
{
if(j!=l&&color[i][j]==color[i][l]&&graph[j][l]==1)
{
flag[i]=0;
}
}
}
if(surplus(color[i],v)>k-1)
{
flag[i]=0;
}
}
for(i=0;i<n;i++)
{
if(flag[i]==1)
{
printf("Yes");
}
if(flag[i]==0)
{
printf("No");
}
printf("\n");
}
return 0;
}
提交结果:
有一部分测试点没有通过,可能是因为着色方案中的着色不相邻。如果有AC的大神,欢迎进行指正!