标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18205 | Accepted: 3960 |
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 <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define inf 0x3f3f3f3f #define mod 10000 typedef long long ll; using namespace std; const int N=505; const int M=300005; int power(int a,int b,int c){int ans=1;while(b){if(b%2==1){ans=(ans*a)%c;b--;}b/=2;a=a*a%c;}return ans;} struct man { int c,f; }w[N][N]; int dis[N],n,m; int t,cnt,maxn=0,ans; ll cost[N][N]; int c[N],f[N]; bool bfs() { queue<int>q; memset(dis,0,sizeof(dis)); q.push(0); dis[0]=1; while(!q.empty() && !dis[t]){ int v=q.front();q.pop(); for(int i=1;i<=t;i++){ //if(i==t)printf("w[i][t].c=%d\n",w[i][t].c); if(!dis[i]&&w[v][i].c>w[v][i].f){ q.push(i); dis[i]=dis[v]+1; } } } return dis[t]!=0; } int dfs(int cur,int cp) { if(cur==t||cp==0)return cp; int tmp=cp,tt; for(int i=1;i<=t;i++){ if(dis[i]==dis[cur]+1 &&w[cur][i].c>w[cur][i].f){ tt=dfs(i,min(w[cur][i].c-w[cur][i].f,tmp)); w[cur][i].f+=tt; w[i][cur].f-=tt; tmp-=tt; } } return cp-tmp; } void dinic() { ans=0; while(bfs())ans+=dfs(0,inf); } void Floyd() { for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j)cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]); else cost[i][j]=0; } } } } void Build(ll x) { memset(w,0,sizeof(w)); for(int i=1;i<=n;i++)w[0][i].c=c[i]; for(int i=n+1;i<=2*n;i++)w[i][t].c=f[i-n]; for(int i=1;i<=n;i++)for(int j=n+1;j<t;j++)if(cost[i][j-n]<=x)w[i][j].c=inf; } int main(){ cin>>n>>m; memset(cost,inf,sizeof(cost)); ll l=0,r=1; t=n*2+1; for(int i=1;i<=n;i++){cin>>c[i]>>f[i];maxn+=c[i];} int a,b;ll val; while(m--){ cin>>a>>b>>val; r+=val; cost[a][b]=cost[b][a]=min(cost[a][b],val); } Floyd(); bool flag=false; while(l<r){ ll mid=(l+r)/2; Build(mid); dinic(); if(ans>=maxn)r=mid,flag=true; else l=mid+1; } if(flag) cout<<r<<endl; else puts("-1"); return 0; }
#include <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define inf 0x3f3f3f3f #define mod 10000 typedef long long ll; using namespace std; const int N=505; const int M=300005; int power(int a,int b,int c){int ans=1;while(b){if(b%2==1){ans=(ans*a)%c;b--;}b/=2;a=a*a%c;}return ans;} struct man { int c,f; }w[N][N]; int dis[N],n,m; int t,cnt,maxn=0,ans; ll cost[N][N]; int c[N],f[N]; bool bfs() { queue<int>q; memset(dis,0,sizeof(dis)); q.push(0); dis[0]=1; while(!q.empty() && !dis[t]){ int v=q.front();q.pop(); for(int i=1;i<=t;i++){ //if(i==t)printf("w[i][t].c=%d\n",w[i][t].c); if(!dis[i]&&w[v][i].c>w[v][i].f){ q.push(i); dis[i]=dis[v]+1; } } } return dis[t]!=0; } int dfs(int cur,int cp) { if(cur==t||cp==0)return cp; int tmp=cp,tt; for(int i=1;i<=t;i++){ if(dis[i]==dis[cur]+1 &&w[cur][i].c>w[cur][i].f){ tt=dfs(i,min(w[cur][i].c-w[cur][i].f,tmp)); w[cur][i].f+=tt; w[i][cur].f-=tt; tmp-=tt; } } return cp-tmp; } void dinic() { ans=0; while(bfs())ans+=dfs(0,inf); } void Floyd() { for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ if(cost[i][k]!=inf){ for(int j=1;j<=n;j++){ cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]); } } } } } void Build(ll x) { memset(w,0,sizeof(w)); for(int i=1;i<=n;i++)w[0][i].c=c[i]; for(int i=n+1;i<=2*n;i++)w[i][t].c=f[i-n]; for(int i=1;i<=n;i++)for(int j=n+1;j<t;j++)if(cost[i][j-n]<=x)w[i][j].c=inf; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j)cost[i][j]=0; else cost[i][j]=inf; } } ll l=0,r=1; t=n*2+1; for(int i=1;i<=n;i++){cin>>c[i]>>f[i];maxn+=c[i];} int a,b;ll val; while(m--){ cin>>a>>b>>val; r+=val; cost[a][b]=cost[b][a]=min(cost[a][b],val); } Floyd(); bool flag=false; while(l<r){ ll mid=(l+r)/2; Build(mid); dinic(); if(ans>=maxn)r=mid,flag=true; else l=mid+1; } if(flag) cout<<r<<endl; else puts("-1"); return 0; }
上面的是WA代码,不知道为什么错了。
POJ2391 Ombrophobic Bovines(网络流)(拆点)
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5835562.html