訓練題 分隊 P1672

2022-08-19 00:03:13 字數 1503 閱讀 8451

每年的cqoi比賽結束後都會組織選手參加一次遊玩活動。由於人數眾多,通常會把選手分成兩隊出發。組委會為了和諧,想盡量把比較熟悉的選手分在同一隊。我們用「友好度」(乙個正整數值)來表示某兩位選手之間的熟悉程度,友好度越大,則兩名選手越熟悉。而「和諧度」定義為兩隊中熟悉程度最低的那對選手的友好度。

現在告訴你選手數量和一些選手之間的友好度,該如何分隊(每組至少1人),才能讓兩隊的和諧度達到最大。請你來幫助組委會完成這個任務。

第一行為兩個正整數n,分別選手的數目以及友好度大於0的選手對數,選手編號為1n。,選手編號為1n。

接下來是乙個n*n的矩陣,矩陣的第i行第j列表示選手i和選手j的友好度c,當i==j時c=0,注意,矩陣一定是斜對稱的。

乙個整數,表示最大和諧度,某些情況下可能為0。

2<=n<=1000

首先這道題是一道需要二分猜答案的二分圖練習題。需要求的是最大和諧度,也就是最小友好度,那麼就用鄰接矩陣存每一段友好度(也就是每一條邊的權值),dfs的時候將大於猜的那個答案的值的邊跳過,小於這個值的邊染色為1和2,判斷小於這個答案的所有邊是否能構成二分圖。然後因為這個圖不一定連通所以當vis等於0的時候就需要dfs一次。

定義乙個l和r,把l賦初值為0,r賦初值為midx,當mid滿足條件時就往右邊猜,往右邊猜就要把l更新成mid+1,否則就往左邊猜,把r更新成mid-1,最後當l=r的時候while迴圈退出輸出ans,程式結束。

注意事項:

1.g[s][q]>=mid和s==q的時候都需要跳過,只有到遇到vis的值為1且兩個端點顏色相等的時候就return false,或者它的子圖不連通的時候return false。

2.每一次check(mid)之前要把color陣列和vis陣列清零避免爆了(。)

3.猜答案的時候跳l和r要+1和-1

#include#include#include#include#define maxn 1005

using namespace std;

int n,midx,midn,ans;

bool flag;

int g[maxn][maxn],color[maxn];

bool vis[maxn];

void init() }}

bool dfs(int s,int c,int mid)

else if(dfs(q,3-c,mid)==false)return false;

} return true;

}void tomid()

} midn=0;

}bool check(int mid)

int main()

else r=mid-1;

} printf("%d\n",ans);

return 0;

}

(p 1 和 ( p 1)的區別

內容會持續更新,有錯誤的地方歡迎指正,謝謝 例1 下面程式的輸出結果是 include void main int p 3 p n cout 0 0 p 0 1 p 2 解析 p是乙個指標,乙個指向長度為3的陣列的指標。直接在p上偏移就是行,在 p上偏移就是列。比如 p 1 等價於p 1 0 等於4...

編譯原理P1

1.高階語言 過程式語言 fortran pascal c 函式式語言 lisp 邏輯式語言 prolog 物件式語言 c 2.低階語言 面向機器的語言 組合語言 機器語言 翻譯 是指在計算機中放置乙個能由計算機直接執行的翻譯程式,它以某一種程式語言 源語言 所編寫的程式 源程式 作為翻譯或加工的物...

Flask WTF 入門使用P1

flask wtf為您的flask應用程式整合了wtforms,具體例子如下 from flask wtf import flaskform from wtforms import stringfield from wtforms.validators import datarequired cla...