最优贸易 10pts 求条
  • 板块学术版
  • 楼主__xsy2013__
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/20 18:19
  • 上次更新2024/4/20 18:24:26
查看原帖
最优贸易 10pts 求条
575714
__xsy2013__楼主2024/4/20 18:19
/**
* By @xusiyuan
* In YUANSHIREN
* C++
**/

# include <bits/stdc++.h>
# define N 100005
# define M 10 * N
# define INF 0x3f3f3f3f

using namespace std;

int head[N], rhead[N], ver[M], Next[M], n, m, tot;
int key[N], big[N], small[N], vis[N];
queue <int> Q;

void ADD(int head[], int x, int y) {
	ver[++tot] = y;
	Next[tot] = head[x];
	head[x] = tot;
} 

void SPFAsmall(int root) {
	memset(small, 0x3f, sizeof(small));
	memset(vis, 0, sizeof(vis));
	small[root] = key[root];
	Q.push(root);
	vis[root] = 1;
	while(Q.size()) {
		int x = Q.front();
		Q.pop();
		vis[x] = 0;
		for(int i = head[x]; ~i; i = Next[i]) {
			int y = ver[i];
			if(small[y] > min(small[x], key[y])) {
				small[y] = min(small[x], key[y]);
				if(!vis[y]) {
					Q.push(y);
					vis[y] = 1;
				}
			}
		}
	}
} 

void SPFAbig(int root) {
	memset(big, 0, sizeof(small));
	memset(vis, 0, sizeof(vis));
	big[root] = key[root];
	Q.push(root);
	vis[root] = 1;
	while(Q.size()) {
		int x = Q.front();
		Q.pop();
		vis[x] = 0;
		for(int i = head[x]; ~i; i = Next[i]) {
			int y = ver[i];
			if(big[y] < min(big[x], key[y])) {
				big[y] = min(big[x], key[y]);
				if(!vis[y]) {
					Q.push(y);
					vis[y] = 1;
				}
			}
		}
	}
} 

int main () {

	int x, y, z;
	memset(head, -1, sizeof(head));
	memset(rhead, -1, sizeof(rhead));
	tot = -1;
	cin >> n >> m;
	for(int i = 1; i <= n; i++) cin >> key[i];
	for(int i = 1; i <= m; i++) {
		cin >> x >> y >> z;
		ADD(head, x, y);
		ADD(rhead, y, x);
		if(z == 2) {
			ADD(head, y, x);
			ADD(rhead, x, y);
		}
	}
	SPFAsmall(1);
	SPFAbig(n);
	int ans = 0;
	for(int i = 1; i <= n; i++) ans = max(big[i] - small[i], ans);
	cout << ans << "\n";

	return 0;
}



2024/4/20 18:19
加载中...