记录编号 80213 评测结果 AAAAAAAAAA
题目名称 [NOIP 2009]最优贸易 最终得分 100
用户昵称 GravatarMongo 是否通过 通过
代码语言 C++ 运行时间 0.442 s
提交时间 2013-11-06 21:35:02 内存使用 5.38 MiB
显示代码纯文本
//#define lgg
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#ifdef lgg
#include <iostream>
#endif
using namespace std;
typedef vector<long>::iterator it;
ifstream in("trade.in"); ofstream out("trade.out");
vector<long> b[100001];
long N, M;
int f[100001], w[100001];
bool inq[100001], ck[100001];
void inline read()
{
	in >> N >> M;
	for(long i(1); i<=N; ++i)
	{
		in >> w[i]; f[i]=w[i];
	}
	long x, y; int z;
	for(long i(1); i<=M; ++i)
	{
		in >> x >> y >> z;
		if(z==1)
			b[y].push_back(x);
		else
		{
			b[y].push_back(x); b[x].push_back(y);
		}
	}
}
void inline Espfa()
{
	queue<long> q;
	for(long k(N); k>=1; --k)
	{
		if(ck[k]==0)continue;
		q.push(k);
		for(it i(b[k].begin()); i!=b[k].end(); ++i)
			q.push(*i);
		while(!q.empty())
		{
			long root(q.front()); q.pop();
			for(it i(b[root].begin()); i!=b[root].end(); ++i)
				if(f[root]>f[*i])
				{
					f[*i]=f[root];
					q.push(*i);
				}
		}
	}
}
void check(long root)
{
	if(ck[root]==1)return;
	ck[root]=1;
	for(it i(b[root].begin()); i!=b[root].end(); ++i)
		check(*i);
	return;
}
int main()
{
	read();
	check(N);
	Espfa();
	int ans(-10000);
	for(long i(2); i<N; ++i)
		ans=max(ans, f[i]-w[i]);
	#ifdef lgg
	for(long i(1); i<=N; ++i)
		out << "点" << i << "能走到的最大价值为" << f[i] << ",其自己的价值为" << w[i] << endl;
	#endif
	out << ans << endl;
	return 0;
}