喜欢用vector的牢大门有福了
查看原帖
喜欢用vector的牢大门有福了
1547772
Studying_check楼主2024/11/21 19:51

rt,主要是看到题解区全用的链式前向星,为此我C了所有题解反复对照修改才写出vector代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge{
	int u,v,r,p,id;
	bool operator<(const edge&o)const{
		return r>o.r;
	}
};
vector<edge>e;
vector<pair<int,int>>g[200005];
queue<int>q;
bool vis[200005];
int in[200005],ans[200005],vr[200005],vp[200005];
int main(){
	cin>>n>>m;
	for(int i=1,u,v,r,p;i<=m;i++){
		cin>>u>>v>>r>>p;
		g[v].push_back({u,i});
		vp[i]=p;
		vr[i]=r;
		in[u]++;
		e.push_back({v,u,r,p,i});
	}
	memset(ans,0x3f,sizeof ans);
	for(int i=1;i<=n;i++){
		if(!in[i])q.push(i);
	}
	sort(e.begin(),e.end());
	for(auto x:e){
		while(!q.empty()){
			int v=q.front();
			q.pop();
			for(auto u:g[v]){
				if(vis[u.second])continue;
				vis[u.second]=1;
				if(ans[v]<1e9){
					ans[u.first]=min(ans[u.first],max(vr[u.second],ans[v]-vp[u.second]));
				}
				in[u.first]--;
				if(!in[u.first])q.push(u.first);
			}
		}
		if(!vis[x.id]){
			vis[x.id]=1;
			ans[x.v]=min(ans[x.v],x.r);
			in[x.v]--;
			if(!in[x.v])q.push(x.v);
		}
	}
	for(int i=1;i<=n;i++)cout<<(ans[i]>1e9?-1:ans[i])<<" ";
}
2024/11/21 19:51
加载中...