hihocoder 1591 錦標賽(費用流)

2021-08-08 20:47:46 字數 1492 閱讀 3645

思路:拆點,每個點拆成兩個,限流的不用多說了吧。然後,關鍵在於某點a和b有邊,但是實際結果只能二選一,怎麼辦呢?弄乙個輔助點c加邊方式(a』,c,1,-sc[a][b]), (b',c,1,-sc[b][a]), (c,c', 1, 0), (c',t, inf, 0); //(u,v,cap,cost)

**:

#include #include #include #include #include #include #include #include #include #include #include #include const double pi = acos(-1.0);

const double eps = 1e-9;

using namespace std;

const int maxn = 50000;

const int maxm = 500000;

const int inf = 0x3f3f3f3f;

struct edge

edge[maxm];

int head[maxn], tol;

int pre[maxn], dis[maxn];

bool vis[maxn];

int n;//節點總個數,節點編號從0~n-1

void init()

void addedge(int u, int v, int cap, int cost)

bool spfa(int s, int t)

dis[s] = 0;

vis[s] = true;

q.push(s);

while (!q.empty())

}} }

if (pre[t] == -1)return false;

else return true;

}//返回的是最大流,cost存的是最小費用

int mincostmaxflow(int s, int t, int &cost)

for (int i = pre[t]; i != -1; i = pre[edge[i ^ 1].to])

flow += min;

} return flow;

}bool flag[105][105];

int sc[105][105];

int n, st, ed;

void add(int i, int j)

int main()

int sum = 0;

for (int i = 1; i <= n; i++)

if (flag[j][i])

sc[i][j] = -1;

}} init();

for (int i = 1; i <= n; i++)

}} int ans = 0;

mincostmaxflow(st, ed, ans);

cout << sum-ans << endl;

} return 0;

}

錦標賽問題 遞迴

設有n位選手參加網球迴圈賽,n 2 k,迴圈賽共進行n 1天,每位選手要與其他n 1位選手比賽一場,且每位選手每天比賽一場,不能輪空,按一下要求為比賽安排日程,1 每位選手必須與其他n 1格選手格賽一場 2 每個選手每天只能賽一場 3 迴圈賽一共進行n 1天 請按此要求將比賽日程表設計成有n行和n ...

NOIP模擬 錦標賽

403機房最近決定舉行一場錦標賽。錦標賽共有n個人參加,共進行n 1輪。第一輪隨機挑選兩名選手進行決鬥,勝者進入下一輪的比賽,第二輪到第n 1輪再每輪隨機挑選1名選手與上一輪勝利的選手決鬥,最後只剩一輪選手。第i名選手與第j名選手決鬥,第i名選手勝利的概率是a i j 作為一號選手的富欖想知道如何安...

牛客 錦標賽

組委會正在為美團點評codem大賽的決賽設計新賽制。比賽有 n 個人參加 其中 n 為2的冪 每個參賽者根據資格賽和預賽 複賽的成績,會有不同的積分。比賽採取錦標賽賽制,分輪次進行,設某一輪有 m個人參加,那麼參賽者會被分為 m 2 組,每組恰好 2 人,m 2組的人分別廝殺。我們假定積分高的人肯定...