标签:desc imu limit cap center creat clear lang sep
Description
Input
Output
Sample Input
3 4 7 2 0 4 2 6 1 2 40 3 2 70 2 3 90 1 3 120
Sample Output
110
Hint
#include<cstdio> #include<vector> #include<queue> #include<cstring> using namespace std; typedef long long LL; const LL INF=2e12+5; const int MAXN=405; int has[MAXN],sz[MAXN],F,P,tot; LL dis[MAXN][MAXN]; struct dinic { struct Edge { int from,to,cap,flow; Edge(){} Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}; }; int s,t,d[MAXN],cur[MAXN]; bool vis[MAXN]; vector<Edge>edges; vector<int>G[MAXN]; inline void init() { for(int i=0;i<=2*F+1;i++)G[i].clear(); edges.clear(); } void addedge(int from,int to,int cap) { edges.push_back((Edge){from,to,cap,0}); edges.push_back((Edge){to,from,0,0}); int m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool bfs() { memset(vis,0,sizeof(vis)); queue<int>q; q.push(s); d[s]=0; vis[s]=1; while(!q.empty()) { int x=q.front();q.pop(); for(int i=0;i<G[x].size();i++) { Edge& e=edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow) { vis[e.to]=1; d[e.to]=d[x]+1; q.push(e.to); } } } return vis[t]; } int dfs(int x,int a) { if(x==t||a==0)return a; int flow=0,f; for(int& i=cur[x];i<G[x].size();i++) { Edge& e=edges[G[x][i]]; if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0) { e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0)break; } } return flow; } int maxflow(int s,int t) { this->s=s,this->t=t; int flow=0; while(bfs()) { memset(cur,0,sizeof(cur)); flow+=dfs(s,2e5+5); } return flow; } }dc; void floyd() { for(int k=1;k<=F;k++) for(int i=1;i<=F;i++) for(int j=1;j<=F;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } bool jud(LL T) { dc.init(); for(int i=1;i<=F;i++) for(int j=1;j<=F;j++) if(dis[i][j]<=T) dc.addedge(i,j+F,2e5+5); for(int i=1;i<=F;i++) dc.addedge(0,i,has[i]),dc.addedge(i+F,2*F+1,sz[i]); return tot==dc.maxflow(0,2*F+1); } int main() { scanf("%d%d",&F,&P); for(int i=1;i<=F;i++) scanf("%d%d",&has[i],&sz[i]),tot+=has[i]; for(int i=1;i<=F;i++) for(int j=1;j<=F;j++) dis[i][j]=(i==j?0:INF); for(int i=1;i<=P;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); dis[u][v]=dis[v][u]=min(dis[u][v],1LL*w); } floyd(); LL l=-1,r=INF,ans=-1; while(l<r) { LL mid=(l+r)/2; if(jud(mid))ans=r=mid; else l=mid+1; } printf("%lld\n",ans); return 0; }
标签:desc imu limit cap center creat clear lang sep
原文地址:http://www.cnblogs.com/homura/p/6078002.html