思路:拆點,每個點拆成兩個,限流的不用多說了吧。然後,關鍵在於某點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組的人分別廝殺。我們假定積分高的人肯定...