38pts 求调
查看原帖
38pts 求调
515129
TLEWA楼主2024/1/23 19:44
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=400005,INF=1e12;

int n,m;

struct Node {
	int u,v,r,p;
};

vector<Node> vec[N],fvec[N];
Node arr[N];

bool cmp(Node a,Node b) {return a.r>b.r;}

int out[N],cost[N];

void del(int u) {
	for(auto to:fvec[u]) {
		if(!out[to.v]) continue;
		cost[to.v]=min(cost[to.v],max(cost[u]-to.p,to.r));
		out[to.v]--;
		if(!out[to.v]) del(to.v);
	}
}

queue<int> que;
void topsort() {
	for(int i=1;i<=n;++i)
		if(out[i]==0) que.push(i);
	
	int u;
	while(!que.empty()) {
		u=que.front();
		que.pop();
		for(auto to:fvec[u]) {
			if(!out[to.v]) continue;
			out[to.v]--;
			if(!out[to.v]) que.push(to.v);
		}
	}
}

signed main() {
	cin >> n >> m;
	for(int i=1;i<=n;++i) cost[i]=INF;
	
	int a,b,r,p;
	for(int i=1;i<=m;++i) {
		cin >> a >> b >> r >> p;
		vec[a].push_back({a,b,r,p});
		fvec[b].push_back({b,a,r,p});
		arr[i]={a,b,r,p};
		out[a]++;
	}
	sort(arr+1,arr+1+m,cmp);
	
	topsort();
	
	int u,v;
	for(int i=1;i<=m;++i) {
		u=arr[i].u,v=arr[i].v;
		if(out[v]==0 || out[u]==0) continue;
		cost[u]=min(cost[u],arr[i].r);
		out[u]--;
		if(!out[u])
			del(u);
	}
	
	for(int i=1;i<=n;++i) {
		if(cost[i]!=INF) cout << cost[i] << ' ';
		else cout << -1 << ' ';
	}
	return 0;
}
2024/1/23 19:44
加载中...