标签:
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 6 5 1 2 1 2 3 1 3 4 1 4 5 1 5 6 1
42 -1
1 #include <bits/stdc++.h> 2 #define type int 3 using namespace std; 4 const int INF = 0x3f3f3f3f; 5 const int maxn = 310; 6 type Lx[maxn],Ly[maxn],W[maxn][maxn],slack[maxn]; 7 bool S[maxn],T[maxn]; 8 int n,Link[maxn]; 9 bool match(int u) { 10 S[u] = true; 11 for(int v = 1; v <= n; ++v) { 12 if(T[v]) continue; 13 type d = Lx[u] + Ly[v] - W[u][v]; 14 if(!d) { //浮点数时需要用精度判0 15 T[v] = true; 16 if(Link[v] == -1 || match(Link[v])) { 17 Link[v] = u; 18 return true; 19 } 20 } else if(slack[v] > d) slack[v] = d; 21 } 22 return false; 23 } 24 void update() { 25 type d = INF; 26 for(int i = 1; i <= n; ++i) 27 if(!T[i] && slack[i] < d) 28 d = slack[i]; 29 for(int i = 1; i <= n; ++i) { 30 if(S[i]) Lx[i] -= d; 31 if(T[i]) Ly[i] += d; 32 else slack[i] -= d; 33 } 34 } 35 void KuhnMunkras() { 36 for(int u = 1; u <= n; ++u) { 37 Lx[u] = -INF; 38 Ly[u] = 0; 39 Link[u] = -1; 40 for(int v = 1; v <= n; ++v) 41 Lx[u] = max(Lx[u],W[u][v]); 42 } 43 for(int u = 1; u <= n; ++u) { 44 for(int v = 1; v <= n; ++v) slack[v] = INF; 45 while(true) { 46 memset(S,false,sizeof S); 47 memset(T,false,sizeof T); 48 if(match(u)) break; 49 update(); 50 } 51 } 52 type ret = 0; 53 for(int i = 1; i <= n; ++i) 54 if(Link[i] == -1 || W[Link[i]][i] == -INF) { 55 puts("-1"); 56 return; 57 } else { 58 ret += W[Link[i]][i]; 59 } 60 printf("%d\n",-ret); 61 } 62 int m; 63 int main() { 64 int u,v,w; 65 while(~scanf("%d%d",&n,&m)) { 66 for(int i = 1; i <= n; ++i) 67 for(int j = 1; j <= n; ++j) 68 W[i][j] = -INF; 69 for(int i = 0; i < m; ++i) { 70 scanf("%d%d%d",&u,&v,&w); 71 W[u][v] = max(W[u][v],-w); 72 } 73 KuhnMunkras(); 74 } 75 return 0; 76 }
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 10010; 4 const int INF = 0x3f3f3f3f; 5 struct arc { 6 int to,flow,cost,next; 7 arc(int x = 0,int y = 0,int z = 0,int nxt = -1) { 8 to = x; 9 flow = y; 10 cost = z; 11 next = nxt; 12 } 13 } e[1000010]; 14 int head[maxn],d[maxn],p[maxn],tot,S,T; 15 int n,m; 16 void add(int u,int v,int flow,int cost) { 17 e[tot] = arc(v,flow,cost,head[u]); 18 head[u] = tot++; 19 e[tot] = arc(u,0,-cost,head[v]); 20 head[v] = tot++; 21 } 22 bool inq[maxn]; 23 bool spfa() { 24 memset(p,-1,sizeof p); 25 memset(d,0x3f,sizeof d); 26 queue<int>q; 27 memset(inq,false,sizeof inq); 28 d[S] = 0; 29 q.push(S); 30 while(!q.empty()) { 31 int u = q.front(); 32 q.pop(); 33 inq[u] = false; 34 for(int i = head[u]; ~i; i = e[i].next) { 35 if(e[i].flow && d[e[i].to] > d[u] + e[i].cost) { 36 d[e[i].to] = d[u] + e[i].cost; 37 p[e[i].to] = i; 38 if(!inq[e[i].to]) { 39 inq[e[i].to] = true; 40 q.push(e[i].to); 41 } 42 } 43 } 44 } 45 return p[T] > -1; 46 } 47 void solve() { 48 int ret = 0,flow = 0; 49 while(spfa()) { 50 int minF = INF; 51 for(int i = p[T]; ~i; i = p[e[i^1].to]) 52 minF = min(minF,e[i].flow); 53 for(int i = p[T]; ~i; i = p[e[i^1].to]) { 54 e[i].flow -= minF; 55 e[i^1].flow += minF; 56 } 57 ret += d[T]*minF; 58 flow += minF; 59 } 60 if(flow != n) puts("-1"); 61 else printf("%d\n",ret); 62 } 63 64 int main() { 65 int u,v,w; 66 while(~scanf("%d%d",&n,&m)) { 67 memset(head,-1,sizeof head); 68 S = n*2 + 2; 69 T = S + 1; 70 for(int i = tot = 0; i < m; ++i) { 71 scanf("%d%d%d",&u,&v,&w); 72 add(u,v+n,1,w); 73 } 74 for(int i = 1; i <= n; ++i) { 75 add(S,i,1,0); 76 add(i+n,T,1,0); 77 } 78 solve(); 79 } 80 return 0; 81 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4678470.html