这道题书上写错了,Dijkstra算法在这道题的情景当中的正确性是无法保证的。
#include<bits/stdc++.h> using namespace std; const int N=100010,M=2000005; int n,m; int dmin[N],dmax[N]; int hz[N],e[M],ne[M],hf[N]; int w[N]; int tot; bool st[N]; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } inline void add(int h[],int a,int b) { ne[++tot]=h[a]; h[a]=tot; e[tot]=b; } inline void spfa(int h[],int dist[],int type) //0求最小值,1求最大值 { queue<int> Q; if(type==0) { memset(dist,0x3f,sizeof(dmin));//memset(dist,0x3f,sizeof(dist)) 这种写法是错误的!! sizeof只能返回静态数组的地址 dist[1]=w[1]; Q.push(1); } else { Q.push(n); dist[n]=w[n]; } while(Q.size()) { int tmp=Q.front();Q.pop();st[tmp]=0; for(int i=h[tmp];i;i=ne[i]) { int j=e[i]; if((type==0&&dist[j]>min(dist[tmp],w[j]))||(type==1&&dist[j]<max(dist[tmp],w[j]))) { if(type==0) dist[j]=min(dist[tmp],w[j]); else dist[j]=max(dist[tmp],w[j]); if(!st[j]) Q.push(j),st[j]=1; } } } } int main() { n=read();m=read(); for(int i=1;i<=n;i++) w[i]=read(); int a,b,c; for(int i=1;i<=m;i++) { a=read();b=read();c=read(); add(hz,a,b);add(hf,b,a); if(c==2) add(hz,b,a),add(hf,a,b); } int res=0; spfa(hz,dmin,0); spfa(hf,dmax,1); for(int i=1;i<=n;i++) res=max(res,dmax[i]-dmin[i]); printf("%d",res); return 0; }