题解 \(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$的更多相关文章

  1. NOIP 模拟 $24\; \rm block$

    题解 \(by\;zj\varphi\) 因为它要求大于它的且放在它前的数的个数要小于它的 \(key\) 值,所以先按 \(\rm val\) 值排序,然后按 \(\rm key\) 值排序,按顺序 ...

  2. NOIP 模拟 $24\; \rm matrix$

    题解 \(by\;zj\varphi\) 发现 \(\rm n,m\) 都很小,考虑分行状压. 但是上一行和下一行的按钮状态会对当前行造成影响,所以再枚举一个上一行的按钮状态. 因为对于两行,只有如下 ...

  3. 2021.5.24考试总结 [NOIP模拟3]

    带着爆0的心态考的试,没想到整了个假rk2 (炸鱼大佬wtz忒强了OTZ T1 景区路线规划 这题对刚学完概率期望的我来说简直水爆了好吗.. 因为存在时间限制,不好跑高斯消元,就直接跑dp就完了. 令 ...

  4. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  5. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  6. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

  7. 7.22 NOIP模拟7

    又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...

  8. NOIP模拟 2

    大概就是考试的时候慌的一批,因为一道正解也没想出来,T1,T3只会暴搜,听见天皇在旁边的窃喜声本渣内心是崩溃的 会打暴搜的我先打了暴搜,大多数时间都用在第二题上,妄想自己能拿50多分- 最后半小时万念 ...

  9. 20190725 NOIP模拟8

    今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...

随机推荐

  1. buu firmware

    一.路由器固件,给的是bin文件,要用binwalk将固件文件系统提取出来,同时binwalk的版本要完整不然解压不了文件,下面说的很清楚了. https://blog.csdn.net/QQ1084 ...

  2. cron表达式详解(转)

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: (1) Seconds Minutes Hours DayofMonth Mo ...

  3. ctf杂项之easy_nbt

    下载附件查看 除了几个文件之外,没有思路 搜索nbt可知,可以使用nbtexplorer工具 果断下载,然后打开题目下载的目录 crrl+f搜索flag 猜测kflag{Do_u_kN0w_nbt?} ...

  4. Linux常用命令 day day up系列3

    一.命令执行的优先级二.Linux目录结构三.cat--查看文件内容四.more--查看文件内容五.less--查看文件内容六.head.tail--查看文件内容七.wc--统计文件内容八.grep- ...

  5. 5000字2021最新Python基础知识第一阶段:数据类型

    1 编程规范 注释 python注释也有自己的规范,在文章中会介绍到.注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被多人调用,为了让别人能更容易理解代码的通途,使用注释是非常有效的 ...

  6. Python之一行代码将网址URL转换成动态彩色二维码

    先在 pycharm 安装 myqr.或者,Python3 必装,然后命令行 pip install myqr  也可. 将我的微信公众号网址:http://weixin.qq.com/r/hRMQC ...

  7. Mycat读写分离的简单实现

    目录 1.Mycat读写分离的配置 1.1.Mycat是什么 1.2.Mycat能干什么 1.2.1.数据库的读写分离 1.2.1.1.数据库读写分离图解 1.2.2.数据库分库分表 1.2.2.1. ...

  8. IDEA上搭建spark开发

    IDEA上搭建spark开发环境 我本地系统是windows10,首先IDEA上要安装了scala插件. 1.下载winutils.exe文件 winutils.exe是在Windows系统上需要的h ...

  9. Ubuntu 18.04 开启 root 账号并允许远程连接

    转载:https://blog.csdn.net/u010766726/article/details/105376461 以普通用户登录系统 通过 "终端" 操作 普通用户 – ...

  10. 【每日算法】存在重复元素 III

    题目描述 这是 LeetCode 上的 220. 存在重复元素 III, 难度为 [中等] 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 ab ...