社区讨论

神秘魔改dijkstra求hack

P9126[USACO23FEB] Moo Route II S参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhiz948x
此快照首次捕获于
2025/11/03 18:08
4 个月前
此快照最后确认于
2025/11/03 18:08
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define inf 1e9+1
const int N=2e5+9;
int n,m,a[N],b[N];
struct edge{int to,s,t;};
vector<edge> e[N];
bool cmp(const edge&a,const edge&b){return a.s<b.s;}
struct node{
	int x,d;
	bool operator<(const node&tmp)const{return d>tmp.d;}
};
priority_queue<node> q;
int main(){
	cin>>n>>m;
	while(m--){
		int u,s,v,t;cin>>u>>s>>v>>t;
		e[u].push_back((edge){v,s,t});
	}
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end(),cmp);
	for(int i=2;i<=n;i++) b[i]=inf;
	b[1]=-a[1];
	q.push((node){1,0});
	while(!q.empty()){
		int u=q.top().x,d=q.top().d;q.pop();
		int l=0,r=e[u].size()-1,res=e[u].size();
		while(l<=r){
			int mid=(l+r)>>1;
			if(e[u][mid].s<d) l=mid+1;
			else r=mid-1,res=mid;
		}
		for(int i=res;i<e[u].size();i++){
			int v=e[u][i].to,w=e[u][i].t;
			if(w<b[v]){
				b[v]=w;
				q.push((node){v,w+a[v]});
			}
		}
	}
	puts("0");
	for(int i=2;i<=n;i++) cout<<(b[i]==inf?-1:b[i])<<endl;
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...