zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    基于python实现自动化办公学习笔记一
    [django]上下文管理器
    [django]中间件
    分布式锁实现
    为什么Redis可以方便地实现分布式锁
    索引字段说明
    COUNT 和 IFNULL函数
    占用空间区别
    java排序算法(七):折半插入排序
    java排序算法(六):直接插入排序
  • 原文地址:https://www.cnblogs.com/smartljy/p/13500904.html
Copyright © 2011-2022 走看看