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\n",hp.empty()?-1:hp.top().d);
    }
    return 0;
}
luogu P3238 [HNOI2014]道路堵塞的更多相关文章
- 洛谷 [HNOI2014]道路堵塞 解题报告
		[HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ... 
- 动态删边SPFA: [HNOI2014]道路堵塞
		[HNOI2014]道路堵塞 题目描述 $A$ 国有 $N$座城市,依次标为$1$到$N$.同时,在这$N$座城市间有$M$条单向道路,每条道路的长度是一个正整数.现在,$A$国交通部指定了一条从城市 ... 
- bzoj 3575: [Hnoi2014]道路堵塞
		Description A 国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径, 并且保证这条路径的长度是所 ... 
- [HNOI2014]道路堵塞
		题目描述 A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N ... 
- bzoj3575[Hnoi2014]道路堵塞
		http://www.lydsy.com/JudgeOnline/problem.php?id=3575 总赶脚第二题总是比第三题难...... 好吧,这题一点思路都没有 听说用民科可以过掉大部分数据 ... 
- BZOJ.3575.[HNOI2014]道路堵塞(最短路 动态SPFA)
		题目链接 \(Description\) 给你一张有向图及一条\(1\)到\(n\)的最短路.对这条最短路上的每条边,求删掉这条边后\(1\)到\(n\)的最短路是多少. \(Solution\) 枚 ... 
- 【BZOJ】3575: [Hnoi2014]道路堵塞
		题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3575 大概的做法是,按照顺序枚举每一条要删去的边,(假设当前点为$u$,在最短路径上的下一 ... 
- 【bzoj3575】 Hnoi2014—道路堵塞
		http://www.lydsy.com/JudgeOnline/problem.php?id=3575 (题目链接) 题意 给出一个有向图和一条最短路,问最短路上任意一条边断掉,此时的最短路是多少. ... 
- 【LG3238】 [HNOI2014]道路堵塞
		题目描述 给你一张\(N\)个点.\(M\)条边的有向图,按顺序给定你一条有\(L\)条边的\(1\rightarrow n\)的最短路, 每次断掉这\(L\)条边中的一条(不对后面答案产生影响),求 ... 
随机推荐
- 组件之间的数据传递--Vuex
			安装Vuex: npm install Vuex -S 在main.js中引入 import Vue from 'vue' import App from './App' import Vuex fr ... 
- 洛谷P1224 向量内积
			什么毒瘤...... 题意:给定n个d维向量,定义向量a和b的内积为 求是否存在两个向量使得它们的内积为k的倍数,并给出任一种方案.k <= 3. 解:很容易想到一个暴力是n2d的.显然我们不能 ... 
- ImageMagickObject.MagickImage.1  '80041771'   -  安装vc2008运行库
			今天重装了系统后,发现 ImageMagick 不能正常的使用了: ImageMagickObject.MagickImage.1 '80041771' convert: 455: unable t ... 
- http 请求头和响应头
			客户端发送请求过程带着的数据: 1.请求地址 2.请求方式 3.请求头 request headers 4.请求参数 https://www.juhe.cn/ 130.... 1a2b....pei ... 
- C connect实现Timeout效果(Linux)
			C connect函数是阻塞的,现要实现非阻塞式的connect. int SocketClient::connectTimeOut(const int &connect_fd, const ... 
- 前端模块化,AMD与CMD的区别
			最近在研究cmd和amd,在网上看到一篇不错的文章,整理下看看. 在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可:如今CPU.浏览器性能得到了极大的提升,很多页面逻辑迁移到 ... 
- SSH整合redis和MongoDB错误笔记
			由于毕设中做的是图片搜索网站,选择前端框用SSH,因为之间接触过SSH框架,略有了解,但没有深究,现在在整合redis和mongodb的过程中遇到很多错误,也是十分痛苦,只能通过百度和一步步尝试着解决 ... 
- (sort 排序)P1583 魔法照片 洛谷
			题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ... 
- 递归思维判断数组a[N]是否为一个递增数组
			递归的方法:记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: bool fun( int a[], int n ) { ) { return true; } ) { ] ... 
- angular cli全局版本大于本地版本 把本地版本升级方式
			查看 angular 版本 ng version 如出现提示 Your global Angular CLI version (xxx) is greater than your local ver ... 
