一道删边最短路的题目

给一个无向图和s、t,每次删掉一条边,询问每次删除后s到t的最短路是否改变。询问互相独立。

从s、t分别跑最短路建出最短路网,然后在最短路网上找割边。

询问的边如果在最短路网上且是割边就改变了,否则不变。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define SZ 456789
int n;
namespace spfa
{
int M=0,vb[SZ],dst[SZ],fst[SZ],nxt[SZ],q[SZ],d1[SZ],d2[SZ],vc[SZ],ids[SZ],f1[SZ],f2[SZ];
bool iq[SZ];
void ad_dl(int a,int b,int c,int id)
{
    ++M; nxt[M]=fst[a]; fst[a]=M; vb[M]=b; vc[M]=c; ids[M]=id;
}
void getsp(int* d,int* f,int S)
{
    int h=0,t=1; q[0]=S;
    for(int i=1;i<=n;i++) d[i]=1000000000, iq[i]=0;
    d[S]=0; iq[S]=1;
    while(h!=t)
    {
        int cur=q[h++]; h&=524287;
        for(int e=fst[cur];e;e=nxt[e])
        {
            int b=vb[e],c=vc[e];
            if(d[b]<=d[cur]+c) continue;
            d[b]=d[cur]+c; f[b]=cur;
            if(!iq[b]) q[t++]=b;
            t&=524287;
        }
        iq[cur]=0;
    }
}
}
namespace cute
{
int M=0,vb[SZ],fst[SZ],nxt[SZ];
void ad_dl(int a,int b)
{
    ++M; nxt[M]=fst[a]; fst[a]=M; vb[M]=b;
}
void addl(int a,int b) {ad_dl(a,b); ad_dl(b,a);}
int dfn[SZ],low[SZ],C=0;
void tarjan(int x,int f)
{
    dfn[x]=low[x]=++C;
    for(int e=fst[x];e;e=nxt[e])
    {
        int b=vb[e];
        if(!dfn[b])
        {
            tarjan(b,x);
            low[x]=min(low[b],low[x]);
        }
        else if(b!=f) low[x]=min(low[x],dfn[b]);
    }
}
}
int xs[SZ],ys[SZ],zs[SZ];
bool out[SZ];
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
int main()
{
    FO(school)
    using namespace spfa;
    int s,t,m;
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        xs[i]=x; ys[i]=y; zs[i]=z;
        spfa::ad_dl(x,y,z,i);
        spfa::ad_dl(y,x,z,i);
    }
    getsp(d1,f1,s); getsp(d2,f2,t);
    for(int i=1;i<=n;i++) dst[i]=d1[i]+d2[i];
    int tar=dst[t];
    for(int i=1;i<=m;i++)
    {
        bool ok=1;
        if(d1[xs[i]]+d2[ys[i]]+zs[i]==tar) cute::addl(xs[i],ys[i]);
        else if(d2[xs[i]]+d1[ys[i]]+zs[i]==tar) cute::addl(xs[i],ys[i]);
        else ok=0;
        if(!ok) out[i]=1;
    }
    for(int i=1;i<=n;i++) if(!cute::dfn[i]) cute::tarjan(i,0);
    using namespace cute;
    int q; scanf("%d",&q);
    while(q--)
    {
        int e;
        scanf("%d",&e);
        int x=xs[e],y=ys[e];
        if(!out[e]&&(low[x]>dfn[y]||low[y]>dfn[x])) puts("No");
        else puts("Yes");
    }
}
时间: 2024-10-27 03:21:01

一道删边最短路的题目的相关文章

练习题(4) -- 一道简单而有有趣的题目

PS: 因为最近一会儿用C++ 写程序,一会儿是python, 一会儿又是java,搞得我都有点语法错乱了. 题目如下:一个字符串形如 "yazyypta"  从这个字符串中删除任何字符,得到的字符串都是它的子字符串,比如对于这个字符串 "ya", "ayy", "pta" 都是它的子字符串,所有的子字符串按照字母序比较大小,求最大的大小最大的子字符串 举几个例子 1) abc c 2)    bcbxa xa 3)   ba

11,一道关于栈内存分配的题目

今天看到一道关于栈内存分配的题目,很是精悍,索性记录下来. 一.题目 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少? #include <stdio.h> int main(){ long long a = 1, b = 2, c = 3; printf("%d %d %d\n", a, b, c); return 0; } 二.解答 输出1 2 3?想想也没这么简单把.如题目所说,32位系统,longlong占8字节,int占4字节

一道简单的CTFpython沙箱逃逸题目

看了几天的ssti注入然后了解到有python沙箱逃逸 学过ssti注入的话python沙箱逃逸还是很容易理解的. 看一道CTF题目,源码的话我改了改,一开始不能用,直接在py2上运行就好. 题目要求读取./key的值,我们这里来执行命令. def make_secure(): UNSAFE = ['open', 'file', 'execfile', 'compile', 'reload', '__import__', 'eval', 'input'] for func in UNSAFE:

一道校招笔试的C语言题目

今天想起一道原先参加校招的一道题目,其原理是C语言挺基础的东西,但很多人都答错了.     struct test {                 int a;         int *c;     };          struct test b;     b.a = 300;     b.c = 500;     printf("%d", b.a + b.c); 大家先想一下结果是多少,然后再运行一下验证验证.想一下是什么原理

hdoj 5137 How Many Maos Does the Guanxi Worth 【枚举删点 + 最短路】

How Many Maos Does the Guanxi Worth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 847    Accepted Submission(s): 322 Problem Description "Guanxi" is a very important word in Chinese. I

由一道工控路由器固件逆向题目看命令执行漏洞

前言 2019 工控安全比赛第一场的一道固件逆向的题目,好像也比较简单,好多人都做出来了.这里就分别从静态和动态调试分析复现一下这个命令执行的洞. 赛题说明 题目给的场景倒是挺真实的:路由器在处理 tddp 协议时出现了命令注入,导致了远程命令执行.就是后面做出来的这个答案的格式咋提交都不对... 题目给了一个压缩文件,解压出来时一个 bin 文件. 使用 binwalk -Me 直接解压,得到了与一个标准的 linux 风格的文件系统: 后来知道这个固件其实就是 tp_link SR20 路由

最短路相关题目

1.luoguP1807 最长路_NOI导刊2010提高(07) 直通 思路: 求最长路,其实跟最短路是一毛一样的,跑一边spfa就好.我们只需要加点小优化:在存边的时候把w存为-w,然后最后输出的时候输出-dis[n]就好 坑点: 这是一个有向图,不是无向图 上代码: #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std;

一道关于变量升级问题的题目

var a = 200; function f() { console.log(a); var a = 100; console.log(a); } f(); console.log(a); var a; console.log(a); var a = 300; console.log(a); 结果:undefined 100 200 200 300 原文地址:https://www.cnblogs.com/luckyXcc/p/9153307.html

ZOJ 3195 Design the city 题解

这个题目大意是: 有N个城市,编号为0~N-1,给定N-1条无向带权边,Q个询问,每个询问求三个城市连起来的最小权值. 多组数据 每组数据  1 < N < 50000  1 < Q < 70000: 一道多源最短路的题目,注意题目数据:N.Q都很大 不能考虑Floyd.SPFA.Dijkstra.Bellman-Ford等最短路算法 再看N-1条边,明显构成一棵树,最短路有且只有一条 很明显需要LCA.... 不懂LCA的点!我!点!我! 我们所熟知的LCA是求两个点的最短路,而