1. 程式人生 > >7-1 圖著色問題(25 分)

7-1 圖著色問題(25 分)

圖著色問題是一個著名的NP完全問題。給定無向圖,,問可否用K種顏色為V中的每一個頂點分配一種顏色,使得不會有兩個相鄰頂點具有同一種顏色?

但本題並不是要你解決這個著色問題,而是對給定的一種顏色分配,請你判斷這是否是圖著色問題的一個解。

輸入格式:

輸入在第一行給出3個整數V0)、E)和K0),分別是無向圖的頂點數、邊數、以及顏色數。頂點和顏色都從1到V編號。隨後E行,每行給出一條邊的兩個端點的編號。在圖的資訊給出之後,給出了一個正整數N),是待檢查的顏色分配方案的個數。隨後N行,每行順次給出V個頂點的顏色(第i個數字表示第i個頂點的顏色),數字間以空格分隔。題目保證給定的無向圖是合法的(即不存在自迴路和重邊)。

輸出格式:

對每種顏色分配方案,如果是圖著色問題的一個解則輸出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

我的程式碼(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;
}

相關推薦

一道老坑爹的題第三章棧作業題2-棧及其應用-計算機17級 7-1 表示式轉換 25

 7-1 表示式轉換 (25 分) 算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。 輸入格式: 輸入在一行中給出不含空格的中綴表示式,可

7-1 悄悄關注 25 ---排序Java容器實現

7-1 悄悄關注 (25 分) 新浪微博上有個“悄悄關注”,一個使用者悄悄關注的人,不出現在這個使用者的關注列表上,但系統會推送其悄悄關注的人發表的微博給該使用者。現在我們來做一回網路偵探,根據某人的關注列表和其對其他使用者的點贊情況,扒出有可能被其悄悄關注的人。 輸

7-12 樹種統計25

lib pop pen 整數 text -s asp pri 正整數 隨著衛星成像技術的應用,自然資源研究機構可以識別每一棵樹的種類。請編寫程序幫助研究人員統計每種樹的數量,計算每種樹占總數的百分比。 輸入格式: 輸入首先給出正整數N(≤10?5??),隨

7-19 PAT Judge25

scrip use == minus then sel inpu style mit The ranklist of PAT is generated from the status list, which shows the scores of the submi

7-3 括號匹配 25

給定一串字元,不超過100個字元,可能包括括號、數字、字母、標點符號、空格,程式設計檢查這一串字元中的( ) ,[ ],{ }是否匹配。 輸入格式: 輸入在一行中給出一行字串,不超過100個字元,可能包括括號、數字、字母、標點符號、空格。 輸出格式: 如果括號配對,輸出yes,否

7-1 關鍵活動 30

假定一個工程專案由一組子任務構成,子任務之間有的可以並行執行,有的必須在完成了其它一些子任務後才能執行。“任務排程”包括一組子任務、以及每個子任務可以執行所依賴的子任務集。 比如完成一個專業的所有課程學習和畢業設計可以看成一個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時

7-1 計算指數 5

  真的沒騙你,這道才是簡單題 —— 對任意給定的不超過10的正整數n,要求你輸出2​n​​。不難吧? 輸入格式: 輸入在一行中給出一個不超過10的正整數n。 輸出格式: 在一行中按照格式 2^n = 計算結果 輸出

7-2 List Leaves 25

  Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each input file c

7-9 旅遊規劃 25 Dijkstra演算法

題意:   思路:單源最短路問題,Dijkstra演算法搞定就可以了,因為要找出最便宜的最短路,所以需要在更新最短距離的時候加一個條件(即當最短距離相等的時候,如果該路徑的花費更小,就更新最小花費)就可以了。之前自己學的最短路的水平也就僅限於模板題的水平,現在可以在條件

7-1 字串替換 15

本題要求編寫程式,將給定字串中的大寫英文字母按以下對應規則替換: 原字母 對應字母 A Z B Y C X D W … … X C Y B Z A 輸入格式: 輸入在一行中給出一個不超

7-2 朋友圈 25

7-2 朋友圈 (25 分) 某學校有N個學生,形成M個俱樂部。每個俱樂部裡的學生有著一定相似的興趣愛好,形成一個朋友圈。一個學生可以同時屬於若干個不同的俱樂部。根據“我的朋友的朋友也是我的朋友”這個推論可以得出,如果A和B是朋友,且B和C是朋友,則A和C也是朋友

7-17 奧運排行榜 25

題目: 思路:針對四種排序方法構建四個結構體,按四種排序排完之後,把結果彙總到代表國家的一個結構體中。然後就是查詢就是了。排序規則可通過下面的例子瞭解一下: 序列:g[0] = 1,g[1] = 2,g[2] = 2, g[3] = 3; 排名:1         

7-24 樹種統計 25

隨著衛星成像技術的應用,自然資源研究機構可以識別每一棵樹的種類。請編寫程式幫助研究人員統計每種樹的數量,計算每種樹佔總數的百分比。 輸入格式: 輸入首先給出正整數N(≤10​5​​),隨後N行,每行給出

PTA 7-1 Huffman Codes 30

7-1 Huffman Codes (30 分) In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redundancy Codes", and h

7-1 Huffman Codes 30

In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redundancy Codes", and hence printed his name in t

7-31 朋友圈 25 (並查集)

7-31 朋友圈 (25 分) 某學校有N個學生,形成M個俱樂部。每個俱樂部裡的學生有著一定相似的興趣愛好,形成一個朋友圈。一個學生可以同時屬於若干個不同的俱樂部。根據“我的朋友的朋友也是我的朋友”這個推論可以得出,如果A和B是朋友,且B和C是朋友,則A和C也是朋友。請編寫程

第三章 迴圈佇列及線性結構綜合-計算機17級 7-2 列車排程 25

7-2 列車排程 (25 分) 火車站的列車排程鐵軌的結構如下圖所示。 兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照{8,4,2,

6-1 Topological Sort 25

6-1 Topological Sort (25 分) 編寫程式以在有向圖中找到拓撲順序。 功能格式: bool TopSort( LGraph Graph, Vertex TopOrder[] ); 其中LGrap

HBU-DS2018SY-3-1 悄悄關注 25

題目描述: 新浪微博上有個“悄悄關注”,一個使用者悄悄關注的人,不出現在這個使用者的關注列表上,但系統會推送其悄悄關注的人發表的微博給該使用者。現在我們來做一回網路偵探,根據某人的關注列表和其對其他使用者的點贊情況,扒出有可能被其悄悄關注的人。 輸入格式: 輸入首先在第一行給出某使用者的

PTA 7-7 Windows訊息佇列25

7-7 Windows訊息佇列(25 分) 訊息佇列是Windows系統的基礎。對於每個程序,系統維護一個訊息佇列。如果在程序中有特定事件發生,如點選滑鼠、文字改變等,系統將把這個訊息加到隊列