题意: 已知有 n 块地,和已经存在的 m 条路径,要求找出从第 1 块地到第 n 块地的 T条不同路径,且每条路径上的道路不能与之前的路径重复,求出满足要求的路径中最长的道路最短可以是多少。
分析: 二分答案,将满足条件的道路长度容量设为 1 ,求最大流,最大流即为路径的条数。
EK:
#include#include #include #define INF 99999999#define maxn 230#define clr(x)memset(x,0,sizeof(x))#define min(a,b)(a)<(b)?(a):(b)int q[1000];int flow[maxn][maxn];int c[maxn][maxn];int a[maxn];int p[maxn];int s,t,tt,n,m;int E_K(){ clr(flow); clr(p); s=1; t=n; int maxflow=0; int u,v,front,rear; for(;;) { clr(a); a[s]=INF; front=rear=0; q[rear++]=s; while(front flow[u][v])) { p[v]=u; q[rear++]=v; a[v]=min(a[u],c[u][v]-flow[u][v]); } } if(a[t]==0) break; for(u=t;u!=s;u=p[u]) { flow[p[u]][u]+=a[t]; flow[u][p[u]]-=a[t]; } maxflow+=a[t]; } return maxflow;}struct node{ int x,y,wi;}sc[410000];bool ok(int di){ int i; clr(c); for(i=0;i =tt) return true; return false;}int main(){ int low,high,mid,i; while(scanf("%d%d%d",&n,&m,&tt)!=EOF) { low=0; high=0; clr(c); for(i=0;i high) high=sc[i].wi; } int res; while(low<=high) { mid=(low+high)/2; if(ok(mid)) { high=mid-1; res=mid; } else low=mid+1; } printf("%d\n",res); } return 0;}