woj1124 網路流好題

2021-08-08 02:00:22 字數 1399 閱讀 9736

【題目大意】

有 n 支球隊,互相之間已經進行了一些比賽,還剩下 m 場沒有比。現在給出各支球隊目前的總分以及還剩下哪 m 場沒有比,問能否合理安排這 m 場比賽的結果,使得第 n 支球隊最後的總分大於其他任何一支球隊的總分。已知每場比賽勝者得 2 分,敗者 0 分,平局則各得 1 分。(1 <= n <= 100, 0 <= m <= 1000)

【建模方法】

首先,所有跟球隊 n 相關的比賽都要讓球隊 n 贏。如果此時仍有某支球隊的總分大於等於球隊 n 的總分,則已經不可能滿足要求;否則按如下方法建圖:每場比賽 i(不包括與球隊 n 相關的比賽)作為乙個點並加邊(s, i, 2),每支球隊 j(不包括球隊 n)作為乙個點並加邊(j, t, score[n]-score[j]-1),每場比賽向與其關聯的兩支球隊 u, v 連邊(i, u, 2), (i, v, 2)。若最大流等於 2*比賽場數(不包括與球隊 n 相關的比賽)則可以滿足要求

注意陣列要開夠,m是1000!!!

#include#include#include#include#includeusing namespace std;

最大流開始//

typedef int cap_type;

#define max_v 1200 + 30 + 16

// 用於表示邊的結構體(終點、容量、反向邊)

struct edge

};vector g[max_v]; // 圖的鄰接表表示

int level[max_v]; // 頂點到源點的距離標號

int iter[max_v]; // 當前弧,在其之前的邊已經沒有用了

// 向圖中加入一條從from到to的容量為cap的邊

void add_edge(int from, int to, int cap)

// 通過bfs計算從源點出發的距離標號

void bfs(int s)

} }}// 通過dfs尋找增廣路

cap_type dfs(int v, int t, cap_type f)

for (int &i = iter[v]; i < g[v].size(); ++i)

}} return 0;

}// 求解從s到t的最大流

cap_type max_flow(int s, int t)

memset(iter, 0, sizeof(iter));

cap_type f;

while ((f = dfs(s, t, 0x3f3f3f3f3f3f3f3f)) > 0)

}}vectorg[105];

int grade[max_v];

///最大流結束/

int main()

int s = m+n+2; int t = s+1;

for(int i=1;i

USACO4 2 網路流模板題

裸的網路流 練習抄模板 紅書dinic 因為bool寫成int除錯了好久qaq 繼續抄模板 匈牙利演算法 vector g maxn 與i相關聯 int from maxn tot bool use maxn bool match int x return false int hungary 嘗試每...

poj 3436 網路流基礎題

題目鏈結 題意 題意確實難讀。首先給出p,n 兩個數 表示有p臺工具機來組裝電腦,每台電腦有n個零件需要組裝 接著p行,每行描述一台工具機 共2 n 1個數字,第乙個數字表示每單位時間該工具機能處理多少未完成品 接下來n個數字表示該工具機能接受的未完成品型別 0表示該零件不能存在 1表示該零件必須存...

日記12(網路流看題總結)

今天一直是在看網路流的題和網路流的建模方法,從昨天的了解一點網路流的皮毛,到現在已經對網路流的解題方法有一定的感覺了。但一定還是比較模糊,不夠熟練。基本都是圍繞大佬edelweiss神的 網路流建模彙總 pdf來看的這裡面寫的建模方法技巧非常詳細,很是神奇,期間有些定義等理論知識和一定演算法要看am...