标签:print pat any arm when script span memory indicator
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18623 | Accepted: 4057 |
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
Source
f个草坪,每个草坪初始有a[i]头牛,最多可以容纳b[i]头牛,无向图,问最少需要多少时间可以使得每头牛都有归宿...
最大流的基础题目...但是我貌似脑残了...TAT...
先Floyd处理出每两个点之间的最短路,二分答案,然后建图...
我们第一想法一定是拆点,把每个点拆成一个出点一个入点,S向入点连一条容量为a[i]的边,出点向T连一条容量为b[i]的边,如果两个点之间最短路小于枚举的ans就连边...
但是这肯定是错误的...(随便一个数据就可以卡...)
正确的建图方法是S向出点连边,入点向T连边,出点向入点连边...这样一头牛从A转移到B之后就不可能再转移到其他点了...
zz的我把lr定义成了long long但是忘记改mid...TAT...
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 //by NeighThorn 6 #define inf 0x3f3f3f3f 7 #define INF 0x3f3f3f3f3f3f3f3f 8 using namespace std; 9 10 const int maxn=200+5,maxm=100000+5; 11 12 int n,m,S,T,cnt,sum,a[maxn],b[maxn],hd[maxn*2],fl[maxm],to[maxm],nxt[maxm],pos[maxn*2]; 13 long long dis[maxn][maxn],Max; 14 15 inline void add(int s,int x,int y){ 16 fl[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++; 17 fl[cnt]=0;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++; 18 } 19 20 inline bool bfs(void){ 21 memset(pos,-1,sizeof(pos)); 22 int head=0,tail=0,q[maxn*2]; 23 q[0]=S,pos[S]=0; 24 while(head<=tail){ 25 int top=q[head++]; 26 for(int i=hd[top];i!=-1;i=nxt[i]) 27 if(pos[to[i]]==-1&&fl[i]) 28 pos[to[i]]=pos[top]+1,q[++tail]=to[i]; 29 } 30 return pos[T]!=-1; 31 } 32 33 inline int find(int v,int f){ 34 if(v==T) 35 return f; 36 int res=0,t; 37 for(int i=hd[v];i!=-1&&f>res;i=nxt[i]) 38 if(pos[to[i]]==pos[v]+1&&fl[i]) 39 t=find(to[i],min(fl[i],f-res)),fl[i]-=t,fl[i^1]+=t,res+=t; 40 if(!res) 41 pos[v]=-1; 42 return res; 43 } 44 45 inline int dinic(void){ 46 int res=0,t; 47 while(bfs()) 48 while(t=find(S,inf)) 49 res+=t; 50 return res; 51 } 52 53 inline int check(long long mid){ 54 cnt=0;memset(hd,-1,sizeof(hd)); 55 for(int i=1;i<=n;i++) 56 add(a[i],S,i+n),add(b[i],i,T),add(inf,i+n,i); 57 for(int i=1;i<=n;i++) 58 for(int j=1;j<=n;j++) 59 if(dis[i][j]<=mid) 60 add(inf,i+n,j); 61 return dinic(); 62 } 63 64 signed main(void){ 65 // freopen("in.txt","r",stdin); 66 Max=0,sum=cnt=0; 67 scanf("%d%d",&n,&m); 68 S=0,T=n*2+1; 69 for(int i=1;i<=n;i++) 70 for(int j=1;j<=n;j++) 71 dis[i][j]=INF; 72 for(int i=1;i<=n;i++) 73 scanf("%d%d",&a[i],&b[i]),sum+=a[i]; 74 for(int i=1,s,x,y;i<=m;i++) 75 scanf("%d%d%d",&x,&y,&s),dis[x][y]=dis[y][x]=min(dis[x][y],(long long)s); 76 for(int k=1;k<=n;k++) 77 for(int i=1;i<=n;i++) 78 for(int j=1;j<=n;j++) 79 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); 80 long long l=0,r=INF-1,ans=-1; 81 while(l<=r){ 82 long long mid=(l+r)>>1; 83 if(check(mid)==sum) 84 ans=mid,r=mid-1; 85 else 86 l=mid+1; 87 } 88 printf("%lld\n",ans); 89 return 0; 90 }//Cap ou pas cap. Cap.
By NeighThorn
标签:print pat any arm when script span memory indicator
原文地址:http://www.cnblogs.com/neighthorn/p/6246587.html