【題目大意】
有 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...