为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Sgu/194

来自NOCOW
< Sgu
跳转到: 导航, 搜索
#include<stdio.h>
#include<string.h>
const int maxn=250,maxm=40050,big=100000000;
int n,m,e[maxm][3],fl[maxn][maxn]={0},de[maxn][2]={0};
int d[maxn]={0},gap[maxn]={0};
inline int min(int xx,int yy) {return xx<yy?xx:yy;}
int sap(int x,int flow)
{
	int i,p,t=flow;
	if(x==n+1) return flow;
	for(i=1;i<=n+1;i++)
		if(d[x]==d[i]+1&&fl[x][i])
		{
			p=sap(i,min(t,fl[x][i]));
			fl[x][i]-=p,fl[i][x]+=p;
			if(!(t-=p)) return flow;
		}
	if(!(--gap[d[x]])) d[0]=n+2;
	++gap[++d[x]];
	return flow-t;
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin);
#endif
	int i,x,y,li,ci,z=0;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d%d%d",&x,&y,&li,&ci);
		fl[x][y]=ci-li;
		de[x][1]+=li,de[y][0]+=li;
		e[i][0]=ci,e[i][1]=x,e[i][2]=y;
	}
	for(i=1;i<=n;i++)
		if(de[i][0]>de[i][1]) fl[0][i]=de[i][0]-de[i][1];
		else fl[i][n+1]=de[i][1]-de[i][0];
	for(gap[0]=n+2;d[0]<n+2;)
		sap(0,big);
	for(i=1;i<=n;i++)
		if(fl[0][i]) {printf("NO\n"),z=1;break;}
	if(!z)
	{
		printf("YES\n");
		for(i=0;i<m;i++)
			printf("%d\n",e[i][0]-fl[e[i][1]][e[i][2]]);
	}
	return 0;
}
<./source>
个人工具