记录编号 158963 评测结果 AAAAAAAAAA
题目名称 [CQOI2015]网络吞吐量 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.824 s
提交时间 2015-04-18 18:34:57 内存使用 5.61 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<deque>
using namespace std;
typedef long long LL;
int n,m,e[510]={0},poi[510]={0},h[1010]={0},r[1010]={0},f[1010][1010];
LL sw[510]={0},ans=0,maxn=0x3f3f3f3f;
class miku
{
public:
	int to;
	int lo;
};
deque<miku> p[501];
deque<int> s,st[1010];
deque<LL> liu[1010];
int check()
{
	for(int i=1;i<=2*n;i++)
		{
			cout<<i<<" "<<r[i]<<endl;
			
			cout<<endl;
		}
	return 0;
}
int in(int i,int j,int k)
{
	miku x;
	x.to=j;
	x.lo=k;
	p[i].push_back(x);
	return 0;
}
int spfa()
{
	deque<int> q;
	int iq[501]={0},rq[501]={0};
	q.push_back(1);
	iq[1]=1;
	sw[1]=0;
	rq[1]++;
	while(!q.empty())
	{
		int x=q.front();
		q.pop_front();
		iq[x]=0;
		for(int j=0;j<p[x].size();j++)
		{
			miku u=p[x][j];
			if(sw[x]+u.lo<sw[u.to])
			{
				sw[u.to]=sw[x]+u.lo;
				if(iq[u.to]==0)
				{
					iq[u.to]=1;
					q.push_back(u.to);
					rq[u.to]++;
				}
			}
		}
	}
	return 0;
}
int bfs()
{
	while(!s.empty())
	{
		int x=s.front();
		s.pop_front();
		for(int i=0;i<p[x].size();i++)
	    {
		miku w=p[x][i];
		if(sw[x]+w.lo==sw[w.to])
		{
			if(w.to!=n)
			{
				st[x].push_back(w.to+n);liu[x].push_back(maxn);
				st[w.to+n].push_back(x);liu[w.to+n].push_back(0);
				st[w.to+n].push_back(w.to);liu[w.to+n].push_back(e[w.to]);
				st[w.to].push_back(w.to+n);liu[w.to].push_back(0);
			}
			else
			{
				st[x].push_back(n+n);liu[x].push_back(maxn);
				st[n+n].push_back(x);liu[x].push_back(0);
			}
			if(poi[w.to]==0)
			{
				poi[w.to]=1;
				s.push_back(w.to);
			}
		}
		}
	}
	return 0;
}
int set()
{
	h[1]=2*n-2;
	for(int i=0;i<st[1].size();i++)
	{
		int x=st[1][i];
			f[1][x]=liu[1][i];
			f[x][1]=-1*liu[1][i];
			r[x]=liu[1][i];
			r[1]-=liu[1][i];
			//cout<<<<" "<<liu[1][i]<<endl;
	}
	return 0;
}
int push(int i,int j)
{
	int c,d;
	c=liu[i][j]-f[i][st[i][j]];
	if(c>0)
	{
		int x=st[i][j];
		d=min(r[i],c);
		f[i][x]+=d;
		f[x][i]=-1*f[i][x];
		r[i]-=d;
		r[x]+=d;
	}
	return 0;
}
int mf()
{
	set();
	int mi,flag=0;
	while(flag==0)
	{
		flag=1;
		//if(r[n*2]!=0)
			//return 0;
		//check();
		for(int i=2;i<n*2;i++)
		{
			if(r[i]>0)
			{
				mi=maxn;
				flag=0;
				for(int j=0;j<st[i].size();j++)
				{
					int x=st[i][j];
					if(liu[i][j]-f[i][x]>0)
					{
						if(h[x]==h[i]-1)
						{
							push(i,j);
							goto NEXT;
						}
					}
					if(h[x]<mi) mi=h[i];
				}
				h[i]=mi+1;
			}
			NEXT:;
		}
		
	}
	return 0;
}
int main()
{
	freopen("cqoi15_network.in","r",stdin);
	freopen("cqoi15_network.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		in(a,b,c);
		in(b,a,c);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&e[i]);
		sw[i]=0x3f3f3f3f;
	}
	if(spfa()==0)
	{
		s.push_back(1);
		poi[1]=1;
		bfs();
		mf();
		for(int i=1;i<=n*2;i++)
		{
			if(i==2*n) continue;
			ans+=f[i][n*2];
		}
	}
	cout<<ans;
	//cout<<st[2].size();
	return 0;
}