四色着色问题 c语言编程,数据结构-图着色问题
7-38 圖著色問題 (25 分)
圖著色問題是一個著名的NP完全問題。給定無向圖G=(V,E),問可否用K種顏色為V中的每一個頂點分配一種顏色,使得不會有兩個相鄰頂點具有同一種顏色?
但本題并不是要你解決這個著色問題,而是對給定的一種顏色分配,請你判斷這是否是圖著色問題的一個解。
輸入格式:
輸入在第一行給出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
一個簡單的遍歷圖的問題,檢查有連線的邊顏色是否相同,判斷使用顏色的數目是否等于k,必須要等于k,大于小于都不行,劃重點。
其他地方就沒有難度了。
#include
#include
#include
#include
using namespace std;
#define maxn 505
int map[maxn][maxn],judge[maxn][maxn];
int color[maxn],tong[maxn];
int n,m,k;
int cmp(int a,int b)
{
return a>b;
}
void init()
{
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
map[i][j] = maxn;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
init();
for(int i = 0; i < m; i ++)
{
int x,y;
scanf("%d %d",&x,&y);
map[x][y] = map[y][x] = 1;
}
int t;
scanf("%d",&t);
while(t--)
{
int flag = 0;
memset(tong,sizeof(tong));
for(int i = 1; i <= n; i ++)
{
scanf("%d",&color[i]);
int temp = color[i];
tong[temp]++;
}
sort(tong,tong+501,cmp);
for(int i = 0; i < maxn; i ++)
{
if(tong[i])
flag++;
else
break;
}
int index = 0;
if(flag>k||flagprintf("Non");
else if(!m)
printf("Yesn");
else
{
for(int i = 1; i <= n; i ++)
{
for(int j = i + 1; j <= n; j ++)
{
if(map[i][j]!=maxn&&color[i]!=color[j])
index ++;
else if(map[i][j]==maxn)
continue;
else if(map[i][j]!=maxn&&color[i]==color[j])
{
index = -1;
break;
}
}
if(index == -1)
break;
}
if(index == m)
printf("Yesn");
else
printf("Non");
}
}
}
總結
以上是編程之家為你收集整理的數據結構-圖著色問題全部內容,希望文章能夠幫你解決數據結構-圖著色問題所遇到的程序開發問題。
如果覺得編程之家網站內容還不錯,歡迎將編程之家網站推薦給程序員好友。
本圖文內容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。
小編個人微信號 jb51ccc
喜歡與人分享編程技術與工作經驗,歡迎加入編程之家官方交流群!
總結
以上是生活随笔為你收集整理的四色着色问题 c语言编程,数据结构-图着色问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询链接服务器信息,如何通过 SQL S
- 下一篇: 吕帅 计算机学院,刘磊-吉林大学计算机科