二分距离,小于当前距离的边容量+1,使最后流>=t
注意 会有重边
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 205 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 int path[N],flow[N],gh[N][N],st,en; 18 int w[N][N]; 19 struct node 20 { 21 int u,v,c; 22 }q[N*N]; 23 int bfs() 24 { 25 int i; 26 memset(path,-1,sizeof(path)); 27 for(i = 1 ; i <= en ; i++) 28 flow[i] = INF; 29 queue<int>q; 30 q.push(1); 31 while(!q.empty()) 32 { 33 int tk = q.front(); 34 q.pop(); 35 if(tk==en) 36 break; 37 for(i = 1 ; i <= en ; i++) 38 { 39 if(path[i]==-1&&gh[tk][i]) 40 { 41 path[i] = tk; 42 flow[i] = min(flow[tk],gh[tk][i]); 43 q.push(i); 44 } 45 } 46 } 47 if(path[en]==-1) 48 return -1; 49 return flow[en]; 50 } 51 int EK() 52 { 53 int now,pre,sum=0,k; 54 while((k=bfs())!=-1) 55 { 56 sum+=k; 57 now = en; 58 while(now!=st) 59 { 60 pre = path[now]; 61 gh[pre][now]-=k; 62 gh[now][pre]+=k; 63 now = pre; 64 } 65 } 66 return sum; 67 } 68 int main() 69 { 70 int n,p,i,m; 71 while(scanf("%d%d%d",&n,&p,&m)!=EOF) 72 { 73 for(i = 1; i <= p ;i++) 74 { 75 scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].c); 76 q[i].u++,q[i].v++; 77 } 78 st = 1; 79 en = n+2; 80 int low = 0,high = 1000000,mid; 81 while(low<=high) 82 { 83 mid = (low+high)>>1; 84 memset(gh,0,sizeof(gh)); 85 gh[st][2] = m; 86 gh[n+1][en] = m; 87 for(i = 1;i <= p ; i++) 88 if(q[i].c<=mid) 89 { 90 gh[q[i].u][q[i].v]+=1; 91 gh[q[i].v][q[i].u]+=1; 92 } 93 if(EK()==m) 94 high = mid-1; 95 else 96 low =mid+1; 97 } 98 cout<<low<<endl; 99 } 100 return 0; 101 }