zoj2314

来源:互联网 发布:用一淘下单算淘宝客吗 编辑:程序博客网 时间:2024/06/12 21:53

zoj又挂了

不知道对不对,先贴代码吧

流问题http://wenku.baidu.com/view/379b6aec4afe04a1b071dedd.html

#include<iostream>#include<stdio.h>#include<string.h>#include<limits.h>#include<queue>#define MAX 400using namespace std;struct node{int y;int next;int cap;int flow;int b;}a[MAX*MAX];int h[MAX],tot=0,leve[MAX],bcap[MAX];void addedge(int i,int j,int b, int c){ a[tot].flow=0; a[tot].b=b; a[tot].y=j;     a[tot].cap=c;     a[tot].next=h[i];     h[i]=tot++;     a[tot].flow=0;   a[tot].b=-b;   a[tot].y=i;     a[tot].cap=0;     a[tot].next=h[j];     h[j]=tot++;  }bool bfs(int s,int t){int u,v,c,i;queue<int> q;memset(leve,-1,sizeof(leve));leve[s]=0;q.push(s);while(!q.empty()){u=q.front();q.pop();i=h[u];while(i!=-1){v=a[i].y;if(a[i].cap>0&&leve[v]==-1){q.push(v);leve[v]=leve[u]+1;}i=a[i].next;}}return leve[t]!=-1;}int dinic(int s,int t){int stack[MAX],last[MAX];int u,v,top=1,minf,i,temp,c,edge,sum=0;while(bfs(s,t)){top=1;stack[top]=s;for(i=s;i<=t;i++){last[i]=h[i];}while(top){u=stack[top];if(u==t){minf=INT_MAX;for(i=1;i<top;i++){edge=last[stack[i]];if(minf>a[edge].cap){minf=a[edge].cap;temp=i;}}for(i=1;i<top;i++){edge=last[stack[i]];a[edge].cap-=minf;a[edge].flow+=minf;a[edge^1].cap+=minf;a[edge^1].flow-=minf;}sum+=minf;top=temp;continue;}edge=last[u];while(edge!=-1){v=a[edge].y;c=a[edge].cap;if(c>0&&leve[u]+1==leve[v]){stack[++top]=v;break;}edge=a[edge].next;}last[u]=edge;if(edge==-1){top--;if(top!=0)last[stack[top]]=a[last[stack[top]]].next;}}}return sum;}int main(){int t,m,n,u,v,c,b,i;bool flag;scanf("%d",&t);while(t--){tot=0;memset(h,-1,sizeof(h));memset(bcap,0,sizeof(bcap));scanf("%d%d",&m,&n);flag=true;for(i=0;i<n;i++){scanf("%d%d%d%d",&u,&v,&b,&c);addedge(u,v,b,c-b);bcap[v]+=b;bcap[u]-=b;}for(i=1;i<=m;i++){if(bcap[i]>0)addedge(0,i,bcap[i],bcap[i]);else  if(bcap[i]<0)  {addedge(i,m+1,-bcap[i],-bcap[i]);}}dinic(0,m+1);for(u=h[0];u!=-1;u=a[u].next){if(a[u].flow!=bcap[a[u].y]){flag=false;break;}}for(u=h[m+1];u!=-1&&flag;u=a[u].next){if(a[u].flow!=bcap[a[u].y]){flag=false;break;}}if(flag==false)printf("NO\n");else{printf("YES\n");for(i=0;i<2*n;i+=2){printf("%d\n",a[i].flow+a[i].b);}}cout<<endl;}}