标签:contains 输入 efi include cti sam city ref 最小
InputAn integer T in the first line indicates the number of the test cases.
In each test case, the first line contains two integers N and M, indicating the number of the cities and the one-way roads. Then M lines followed, each line has three integers U, V and W (0 < W <= 10000), indicating that there is a road from U to V, with the distance of W.
It is guaranteed that at least one valid arrangement of the tour is existed.
A blank line is followed after each test case.OutputFor each test case, output a line with exactly one integer, which is the minimum total distance.Sample Input
1 6 9 1 2 5 2 3 5 3 1 10 3 4 12 4 1 8 4 6 11 5 4 7 5 6 9 6 5 4
Sample Output
42
The route should contain one or more loops.
一个或多个环。。二分匹配足以。。 把权值取反 然后套最大权值匹配即可
注意有重边。。但我们是要最小值 取反后在输入的时候只保留max的值即可
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <cmath> #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; const int maxn = 220, INF = 0x7fffffff; int usedx[maxn], usedy[maxn], cy[maxn], cx[maxn], w[maxn][maxn], bx[maxn], by[maxn]; int nx, ny, n, minn, min_val, m; int dfs(int u) { usedx[u] =1 ; for(int i=1; i<=ny; i++) { if(usedy[i] == -1) { int t = bx[u] + by[i] - w[u][i]; if(t == 0) { usedy[i] = 1; if(cy[i] == -1 || dfs(cy[i])) { cy[i] = u; cx[u] = i; return 1; } } else if(t > 0) minn = min(minn, t); } } return 0; } void km() { mem(cy, -1); mem(cx, -1); for(int i=0; i<=nx; i++) bx[i] = -INF; mem(by, 0); for(int i=1; i<=nx; i++) for(int j=1; j<=ny; j++) bx[i] = max(bx[i], w[i][j]); for(int i=1; i<=nx; i++) { while(1) { minn = INF; mem(usedx, -1); mem(usedy, -1); if(dfs(i)) break; for(int j=1; j<=nx; j++) if(usedx[j] != -1) bx[j] -= minn; for(int j=1; j<=ny; j++) if(usedy[j] != -1) by[j] += minn; } } min_val = 0; for(int i=1; i<=nx; i++) if(cx[i] != -1) min_val += w[i][cx[i]]; printf("%d\n",-min_val); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) w[i][j] = -INF; for(int i=1; i<=m; i++) { int u, v, c; scanf("%d%d%d",&u,&v,&c); w[u][v] = max(w[u][v], -c); } nx = ny = n; km(); } return 0; }
标签:contains 输入 efi include cti sam city ref 最小
原文地址:https://www.cnblogs.com/WTSRUVF/p/9311819.html