图着色问题 (25分)

在这里插入图片描述

输入样例:

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

思路:

基本思路就是DFS,检查是否有染色违规的。很坑的是出现的颜料种数大于K,也违规。所以要用一个count计数,遇到新出现的颜色就count++.

源码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 5000
typedef struct Gnode *Graph;
struct Gnode{
	int Nv;
	int Ne;
	int G[Max][Max];
	int color[Max];
};
Graph Creat(void)
{
	Graph p=(Graph)malloc(sizeof(struct Gnode));
	p->Nv=0;
	p->Ne=0; 
	return p;
}
void Insert(Graph MGraph,int a,int b)
{
	MGraph->G[a][b]=1;
	MGraph->G[b][a]=1;
}
int DFS_color(Graph MGraph,int *Visited,int Vertex)
{
	Visited[Vertex]=1;
	int i,j;
	 for(i=1;i<=MGraph->Nv;i++)
	 {
	 	for(j=1;j<=MGraph->Nv;j++)
	 	{
	 		if(MGraph->G[i][j]&&MGraph->color[i]==MGraph->color[j])
	 		{
	 			return 0;
			}
		}
	 } 
	 return 1;
}
void judge_Ok(Graph MGraph,int K)
{
	int i,j;
	int count=0;
	/*count记录当前颜色的个数*/ 
	for(i=1;i<=MGraph->Nv;i++)
	{
		scanf("%d",&MGraph->color[i]);
		
		int f=1;
		for(j=1;j<i;j++)
		{
			if(MGraph->color[i]==MGraph->color[j])
			{
				f=0;break;
			}
		}
		/*f==1说明是一种新出现的颜色,count++;*/ 
		 if(f)count++;
	}
	/*当颜色数目 count > K 时违规,方案不可行 */ 
	if(count!=K)
	{
		printf("No\n");
		return ;
	}
	
	int Visited[MGraph->Nv+1];
	for(i=0;i<=MGraph->Nv;i++)
	Visited[i]=0;
	
	int flag=DFS_color(MGraph,Visited,1);
	
	if(flag)printf("Yes\n");
	else printf("No\n");
}
int main()
{
	Graph MGraph=Creat();
	int V,E,K;
	scanf("%d%d%d",&V,&E,&K);
	MGraph->Ne=E;
	MGraph->Nv=V;
	int i,v1,v2;
	for(i=0;i<E;i++)
	{
		scanf("%d%d",&v1,&v2);
		Insert(MGraph,v1,v2);
	}
	int N;
	scanf("%d",&N);
	for(i=0;i<N;i++)
	{
		judge_Ok(MGraph,K);
	} 
	
	return 0;
}
发布了85 篇原创文章 · 获赞 12 · 访问量 1999
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览