• luogu P3238 [HNOI2014]道路堵塞


    传送门

    这什么题啊,乱搞就算了,不知道SPFA已经死了吗 不对那个时候好像还没死

    暴力就是删掉边后跑Dijkstra SPFA

    然后稍微分析一下,可以发现题目中要求的不经过最短路某条边的路径,一定是先在最短路上走,然后走不是最短路的边,然后走回在最短路上的点走完最短路,因为绕两次肯定不优

    所以每次断掉一条边,就从这条边的起点更新最短路,如果走到一个在后面的最短路上的点(如果走到在前面的点,那么到终点会经过断掉的边),就可以丢到堆里,然后每次把堆里不合法的(在前面绕路的)路径删掉,取堆顶就是答案

    复杂度(O()玄学(SPFA))

    #include<bits/stdc++.h>
    #define LL long long
    #define db double
    #define il inline
    #define re register
    
    using namespace std;
    const int N=1e5+10;
    il int rd()
    {
        int x=0,w=1;char ch=0;
        while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
        return x*w;
    }
    int to[N<<1],nt[N<<1],w[N<<1],hd[N],tot;
    il void add(int x,int y,int z){++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;}
    struct node
    {
        int x,d;
        bool operator < (const node &bb) const {return d>bb.d;}
    }a[N];
    priority_queue<node> hp;
    queue<int> q;
    bool v[N],vv[N];
    int n,m,kk,di[N],e[N],p[N],id[N],d1[N],dn[N];
    int st[N],tp;
    
    int main()
    {
        n=rd(),m=rd(),kk=rd();
        for(int i=1;i<=m;++i)
        {
            int x=rd(),y=rd(),z=rd();
            add(x,y,z);
        }
        p[0]=1;
        for(int i=1;i<=kk;++i) e[i]=rd(),p[i]=to[e[i]],id[to[e[i]]]=i;
        for(int i=1;i<=kk;++i) d1[i]=d1[i-1]+w[e[i]];
        for(int i=kk;i;--i) dn[i-1]=dn[i]+w[e[i]];
        memset(di,0x3f3f3f,sizeof(di));
        for(int h=0;h<kk;++h)
        {
            while(tp) vv[st[tp--]]=0;
            di[p[h]]=d1[h],v[p[h]]=1,q.push(p[h]);
            while(!q.empty())
            {
                int x=q.front();
                q.pop();
                for(int i=hd[x];i;i=nt[i])
                {
                    if(i==e[h+1]) continue;
                    int y=to[i];
                    if(id[y]&&id[y]>=h)
                    {
                        if(!vv[y])
                        {
                            vv[y]=1;
                            st[++tp]=y;
                            a[y].x=id[y],a[y].d=di[x]+w[i]+dn[id[y]];
                        }
                        else a[y].d=min(a[y].d,di[x]+w[i]+dn[id[y]]);
                    }
                    else if(di[y]>di[x]+w[i])
                    {
                        di[y]=di[x]+w[i];
                        if(!v[y]) v[y]=1,q.push(y);
                    }
                }
                v[x]=0;
            }
            for(int i=1;i<=tp;++i) hp.push(a[st[i]]);
            while(!hp.empty()&&hp.top().x<=h) hp.pop();
            printf("%d
    ",hp.empty()?-1:hp.top().d);
        }
        return 0;
    }
    
  • 相关阅读:
    hdu 1427 速算24点
    HDFS Safemode问题
    surfaceDestroyed什么时候被调用
    C# DataTable的詳細使用方法
    HDU 2460 Network(双连通+树链剖分+线段树)
    撰写架构设计文档的心得体会
    win7下jdk安装环境变量配置
    Android提高第二篇之SurfaceView的基本使用
    UVa 490
    bnu 34982 Beautiful Garden(暴力)
  • 原文地址:https://www.cnblogs.com/smyjr/p/10415723.html
Copyright © 2020-2023  润新知