4 5 1 2 1 2 3 1 3 4 1 1 3 2 2 4 2
6
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #include <stack> 13 #define LL long long 14 #define pii pair<int,int> 15 #define INF 0x3f3f3f3f 16 using namespace std; 17 const int maxn = 100100; 18 struct arc{ 19 int u,v,w,f,next; 20 arc(int a = 0,int b = 0,int c = 0,int x = 0,int y = 0){ 21 u = a; 22 v = b; 23 w = c; 24 f = x; 25 next = y; 26 } 27 }; 28 arc e[maxn]; 29 int head[1010],tot,d[1010],n,m,S,T; 30 int p[1010],q[maxn<<2],hd,tail; 31 bool in[1010]; 32 void add(int u,int v,int w,int f){ 33 e[tot] = arc(u,v,w,f,head[u]); 34 head[u] = tot++; 35 e[tot] = arc(v,u,-w,0,head[v]); 36 head[v] = tot++; 37 } 38 bool spfa(){ 39 for(int i = S; i <= T; i++){ 40 d[i] = INF; 41 in[i] = false; 42 p[i] = -1; 43 } 44 hd = tail = 0; 45 in[S] = true; 46 d[S] = 0; 47 q[tail++] = S; 48 while(hd < tail){ 49 int u = q[hd++]; 50 in[u] = false; 51 for(int i = head[u]; ~i; i = e[i].next){ 52 if(e[i].f > 0 && d[e[i].v] > d[u]+e[i].w){ 53 d[e[i].v] = d[u] + e[i].w; 54 p[e[i].v] = i; 55 if(!in[e[i].v]){ 56 in[e[i].v] = true; 57 q[tail++] = e[i].v; 58 } 59 } 60 } 61 } 62 return p[T] > -1; 63 } 64 int solve(){ 65 int ans = 0; 66 while(spfa()){ 67 int maxVal = INF; 68 for(int i = p[T]; ~i; i = p[e[i].u]) 69 maxVal = min(maxVal,e[i].f); 70 for(int i = p[T]; ~i; i = p[e[i].u]){ 71 e[i].f -= maxVal; 72 e[i+1].f += maxVal; 73 ans += maxVal*e[i].w; 74 } 75 } 76 return ans; 77 } 78 int main() { 79 int u,v,w; 80 while(~scanf("%d %d",&n,&m)){ 81 S = tot = 0; 82 T = n+1; 83 memset(head,-1,sizeof(head)); 84 add(S,1,0,2); 85 add(n,T,0,2); 86 for(int i = 0; i < m; i++){ 87 scanf("%d %d %d",&u,&v,&w); 88 add(u,v,w,1); 89 add(v,u,w,1); 90 } 91 printf("%d\n",solve()); 92 } 93 return 0; 94 }