L2-023 图着色问题

解题思路:

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的大神,欢迎进行指正!

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值