全WA求助,前向星,Dij+反图
查看原帖
全WA求助,前向星,Dij+反图
728459
HeYilin楼主2023/11/11 10:48

Rt,参照了某篇题解的思路,但是全WA了

#include<bits/stdc++.h>
#define PII pair<int,int>
typedef long long int ll;
using namespace std;
const int maxn=2e5+10,INF=0x7fffffff;
int n,m,s,x,y,z,u,v,ans=INT_MIN,t[maxn];
int cnte,fire[maxn],dise[maxn];
int cntE,firE[maxn],disE[maxn];
bool booke[maxn];
bool bookE[maxn];
priority_queue< PII,vector< PII >,greater< PII > >q;
struct node{
	int to,w,nxt;
}e[maxn],E[maxn];
void add_edgee(int a,int b){
	e[++cnte].to=b;
	e[cnte].nxt=fire[a];
	fire[a]=cnte;
}
void add_edgeE(int a,int b){
	E[++cntE].to=b;
	E[cntE].nxt=firE[a];
	firE[a]=cntE;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>t[i];
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		add_edgee(x,y);
		add_edgeE(y,x);
		if(z==2){
			add_edgee(y,x);
			add_edgeE(x,y);
		}
	}
	s=1;
	for(int i=1;i<=n;i++)dise[i]=INF,booke[i]=0;
	dise[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty()){
		u=q.top().second;
		q.pop();
		if(booke[u])continue;
		booke[u]=1;
		for(int i=fire[u];i;i=e[i].nxt){
			v=e[i].to;
			if(!booke[v]&&dise[v]>dise[u]){
				dise[v]=min(dise[u],t[v]);
				q.push(make_pair(dise[v],v));
			}
		}
	}
	s=n;
	for(int i=1;i<=n;i++)disE[i]=INF,bookE[i]=0;
	disE[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty()){
		u=q.top().second;
		q.pop();
		if(bookE[u])continue;
		bookE[u]=1;
		for(int i=firE[u];i;i=E[i].nxt){
			v=E[i].to;
			if(!bookE[v]&&disE[v]<disE[u]){
				disE[v]=max(disE[u],t[v]);
				q.push(make_pair(disE[v],v));
			}
		}
	}
	for(int i=1;i<=n;i++)ans=max(ans,disE[i]-dise[i]);
	cout<<ans;
	return 0;
}
/*
5 5
4 3 5 6 1
1 2 1
1 4 1
2 3 2
3 5 1
4 5 2

*/
2023/11/11 10:48
加载中...