图的m着色问题(洛谷-P2819)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                图的m着色问题(洛谷-P2819)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                題目描述
給定無向連通圖G和m種不同的顏色。用這些顏色為圖G的各頂點著色,每個頂點著一種顏色。如果有一種著色法使G中每條邊的2個頂點著不同顏色,則稱這個圖是m可著色的。圖的m著色問題是對于給定圖G和m種顏色,找出所有不同的著色法。
輸入輸出格式
輸入格式:
對于給定的無向連通圖G和m種不同的顏色,編程計算圖的所有不同的著色法。
輸出格式:
程序運行結束時,將計算出的不同的著色方案數輸出。
輸入輸出樣例
輸入樣例#1:
5 8 4
 1 2
 1 3
 1 4
 2 3
 2 4
 2 5
 3 4
 4 5
輸出樣例#1:
 48
思路:圖的著色問題模版題
源代碼
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<bitset> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 5000+5; const int dx[] = {-1,1,0,0,-1,-1,1,1}; const int dy[] = {0,0,-1,1,-1,1,-1,1}; using namespace std;int m,n,k; int G[N][N]; int color[N]; int res; void dfs(int x) {if(x == n+1) {res++;return;}else {for(int i=1; i<=k; i++) {bool flag=false;for(int y=1; y<=x; y++) {if(G[x][y]==1 && color[y]==i) {flag=true;break;}}if(flag==true)continue;color[x]=i;dfs(x+1);color[x]=0;}} } char mp[N][N]; int main() {scanf("%d%d%d",&n,&m,&k);//n個點m條邊k種顏色for(int i=1; i<=m; i++) {int x,y;scanf("%d%d",&x,&y);G[x][y] = 1;G[y][x] = 1;}dfs(1);printf("%d",res);return 0; }?
總結
以上是生活随笔為你收集整理的图的m着色问题(洛谷-P2819)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 字符串处理 —— 回文串相关
- 下一篇: C++语言基础 —— STL —— 算法
