各位大神,這樣寫為什么會有邏輯問題,是不是深搜只能選取一個起點嗎
題目背景
給定無向連通圖G和m種不同的顏色。用這些顏色為圖G的各頂點著色,每個頂點著一種顏色。如果有一種著色法使G中每條邊的2個頂點著不同顏色,則稱這個圖是m可著色的。圖的m著色問題是對于給定圖G和m種顏色,找出所有不同的著色法。
題目描述
對于給定的無向連通圖G和m種不同的顏色,編程計算圖的所有不同的著色法。
輸入格式
第1行有3個正整數n,k 和m,表示給定的圖G有n個頂點和k條邊,m種顏色。頂點編號為1,2,…,n。接下來的k行中,每行有2個正整數u,v,表示圖G 的一條邊(u,v)。
輸出格式
程式運行結束時,將計算出的不同的著色方案數輸出。
#include<bits/stdc++.h>
using namespace std;
int n,k,m,ans;
int mp[105][105];
int color[105];
bool check(int x,int t){//x節點能不能染t色
for(int i=1;i<=n;i++){
if(mp[x][i]==1&&t==color[i])return false;
}
return true;
}
void dfs(int sum){
if(sum>=n){
ans++;
return;
}
for(int i=1;i<=n;i++){//選一個節點
if(!color[i]){//這個節點沒有染色
for(int j=1;j<=m;j++){//選一個顏色
if(check(i,j)){//判斷這個節點能不能染這個顏色
color[i]=j;
dfs(sum+1);
color[i]=0;//染色
}
}
}
}
}
int main(){
cin>>n>>k>>m;
//鄰接矩陣
for(int i=0;i<k;i++){
int x,y;
cin>>x>>y;
mp[x][y]=1;
mp[y][x]=1;
}
dfs(0);
cout<<ans<<endl;
return 0;
}
uj5u.com熱心網友回復:
“給定一個小點的輸入,完整單步跟蹤(同時按Alt+7鍵查看Call Stack里面從上到下列出的對應從里層到外層的函式呼叫歷史)一遍。”是理解遞回函式作業原理的不二法門!遞回函式關注以下幾個因素
·退出條件
·引數有哪些
·回傳值是什么
·區域變數有哪些
·全域變數有哪些
·何時輸出
·會不會導致堆疊溢位
uj5u.com熱心網友回復:
謝謝趙四老師
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/12628.html
標籤:C++ 語言
上一篇:當鍵入while陳述句結束的指令時總是閃退,嘗試在各個地方加gechar()都不行
下一篇:nginx編譯問題
