NOIP 模拟 $24\; \rm graph$
题解 \(by\;zj\varphi\)
首先一个点能否选择的条件是 \(dis_{1,x}+dis_{x,n}=dis_{1,n}\)
正解是计算一条道路上的所有为 \(-1\) 边的选择范围,是个一次函数。
但是有一种做法,枚举所有的存在的边权,可以证明若 \(-1\) 边的边权为两个存在的边权之间,那么它的情况一定可以被大的和小的共同覆盖。
\(spfa\) 即可
Code:
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
    char buf[1<<21],*p1=buf,*p2=buf,OPUT[100];
    #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++;
    template<typename T>inline void read(T &x) {
        ri f=1;x=0;register char ch=gc();
        while(!isdigit(ch)) {if (ch=='-') f=0;ch=gc();}
        while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
        x=f?x:-x;
    }
    template<typename T>inline void print(T x,char t) {
        if (x<0) putchar('-'),x=-x;
        if (!x) return putchar('0'),(void)putchar(t);
        ri cnt(0);
        while(x) OPUT[p(cnt)]=x%10,x/=10;
        for (ri i(cnt);i;--i) putchar(OPUT[i]^48);
        return (void)putchar(t);
    }
}
using IO::read;using IO::print;
namespace nanfeng{
    #define FI FILE *IN
    #define FO FILE *OUT
    template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
    template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
    typedef long long ll;
    static const int N=1e3+7,INF=1061109567;
    map<int,int> mp;
    int first[N],wai[N<<1],que[N*100],vis[N],ans[N],W,tot,t=1,n,m;
    struct edge{int v,w,nxt;}e[N<<2];
    ll disf[N],disr[N];
    inline void add(int u,int v,int w) {
        e[t].v=v,e[t].w=w,e[t].nxt=first[u],first[u]=t++;
        e[t].v=u,e[t].w=w,e[t].nxt=first[v],first[v]=t++;
    }
    inline void spfaf() {
        memset(disf,127,sizeof(ll)*(n+1));
        ri hd=1,tl=0;
        int x=1;
        disf[que[p(tl)]=x]=0;
        while(hd<=tl) {
            vis[x=que[hd++]]=0;
            for (ri i(first[x]),v;i;i=e[i].nxt) {
                int w=(e[i].w==-1)?W:e[i].w;
                if (disf[v=e[i].v]>disf[x]+w) {
                    disf[v]=disf[x]+w;
                    if (!vis[v]) vis[que[p(tl)]=v]=1;
                }
            }
        }
    }
    inline void spfar() {
        memset(disr,127,sizeof(ll)*(n+1));
        ri hd=1,tl=0;
        int x=n;
        disr[que[p(tl)]=x]=0;
        while(hd<=tl) {
            vis[x=que[hd++]]=0;
            for (ri i(first[x]),v;i;i=e[i].nxt) {
                 int w=(e[i].w==-1)?W:e[i].w;
                if (disr[v=e[i].v]>disr[x]+w) {
                    disr[v]=disr[x]+w;
                    if (!vis[v]) vis[que[p(tl)]=v]=1;
                }
            }
        }
    }
    inline void solve(int w) {
        W=w;
        spfaf(),spfar();
        for (ri i(1);i<=n;p(i)) if (disf[i]+disr[i]==disf[n]) ans[i]=1;
    }
    inline int main() {
        //FI=freopen("nanfeng.in","r",stdin);
        //FO=freopen("nanfeng.out","w",stdout);
        read(n),read(m);
        for (ri i(1),u,v,w;i<=m;p(i)) {
            read(u),read(v),read(w);
            if (w!=-1&&mp.find(w)==mp.end()) mp[wai[p(tot)]=w]=1;
            add(u,v,w);
        }
        if (mp.find(0)==mp.end()) wai[p(tot)]=0;
        wai[p(tot)]=INF;
        for (ri i(1);i<=tot;p(i)) solve(wai[i]);
        for (ri i(1);i<=n;p(i)) putchar(ans[i]^48);
        puts("");
        return 0;
    }
}
int main() {return nanfeng::main();}
NOIP 模拟 $24\; \rm graph$的更多相关文章
- NOIP 模拟 $24\; \rm block$
		题解 \(by\;zj\varphi\) 因为它要求大于它的且放在它前的数的个数要小于它的 \(key\) 值,所以先按 \(\rm val\) 值排序,然后按 \(\rm key\) 值排序,按顺序 ... 
- NOIP 模拟 $24\; \rm matrix$
		题解 \(by\;zj\varphi\) 发现 \(\rm n,m\) 都很小,考虑分行状压. 但是上一行和下一行的按钮状态会对当前行造成影响,所以再枚举一个上一行的按钮状态. 因为对于两行,只有如下 ... 
- 2021.5.24考试总结   [NOIP模拟3]
		带着爆0的心态考的试,没想到整了个假rk2 (炸鱼大佬wtz忒强了OTZ T1 景区路线规划 这题对刚学完概率期望的我来说简直水爆了好吗.. 因为存在时间限制,不好跑高斯消元,就直接跑dp就完了. 令 ... 
- NOIP模拟 1
		NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ... 
- 2021.5.22 noip模拟1
		这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ... 
- NOIP模拟3
		期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ... 
- 7.22 NOIP模拟7
		又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ... 
- NOIP模拟 2
		大概就是考试的时候慌的一批,因为一道正解也没想出来,T1,T3只会暴搜,听见天皇在旁边的窃喜声本渣内心是崩溃的 会打暴搜的我先打了暴搜,大多数时间都用在第二题上,妄想自己能拿50多分- 最后半小时万念 ... 
- 20190725 NOIP模拟8
		今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ... 
随机推荐
- GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT
			预热文章系列:<GIS历史概述与WebGis应用开发技术浅解>.<GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换>.<OGC标准WMTS ... 
- python 常见面试问题
			https://blog.csdn.net/weixin_43789195/article/details/87469096 https://blog.csdn.net/qq_42642945/art ... 
- Android布局方式总结
			Android的布局分别是:线性布局LinearLayout.相对布局RelativeLayout.帧布局FrameLayout.网格布局GridLayout.约束布局ConstraintLayout ... 
- 公钥-私钥 白名单-黑名单 Linux 远程访问及控制(SSH)
			远程访问及控制一.SSH远程管理二.OpenSSH服务器① SSH (Secure Shell)协议② OpenSSH三.配置OpenSSH服务器举例四.sshd 服务支持两种验证方式五.使用SSH客 ... 
- CentOS 7安装Python3 笔记
			当前系统为阿里云的CentOS7.3 64位操作系统. 为了能让后续安装的软件(django,uwsgi,nginx等)尽量减少出现bug的几率,先把可能的依赖包都安装上. 一.安装依赖包 yum - ... 
- P4494 [HAOI2018]反色游戏
			P4494 [HAOI2018]反色游戏 题意 给你一个无向图,图上每个点是黑色或者白色.你可以将一条边的两个端点颜色取反.问你有多少种方法每个边至多取反一次使得图上全变成白色的点. 思路 若任意一个 ... 
- g6中的变换矩阵matrix
			在看g6文档的时候看到一个变换矩阵,不明觉厉,如下 matrix = 1 0 0 0 1 0 0 0 1 于是查资料了解里面每个数字的意义,和css3的matrix()方法似乎类同 transform ... 
- C++调试总结
			一.参考: 本文主要参考<C++编程调试秘笈>一书. 在编写C++代码时,我们不应该自己捕捉缺陷,而是由编译器和可执行代码为我们做这些事情,该书便提供了这样的一个思考.作者以"调 ... 
- 当鼠标移入div上时,div的背景色在4s之内渐变为灰色,同时在5s之内顺时针旋转45度,且尺寸缩小一半;当鼠标移走时,再渐变恢复初始样式
			<style> #d1{ width:200px; height:200px; border:1px solid #000; transition:background 4s linear ... 
- 01_安装电脑软件的步骤批处理脚本.bat
			REM 01_安装电脑软件的步骤批处理脚本.bat MD 01_安装电脑软件的步骤 REM ZIP解压密码空格MD 02_制作杏雨梨云USB维护系统2019中秋版之国庆更新固态U盘MD 03_复制安装 ... 
