YbtOj例题:最短路3 最优贸易

这道题书上写错了,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;
}
原文地址:https://www.cnblogs.com/smartljy/p/13500904.html