Aizu - 1383 Pizza Delivery (最短路图+DAG上的割边)
题意:给出一张有向图,每条边有长度,对于每条边,你要回答将该边的方向取反后,从起点到终点的最短距离是增加or减小or不变。
首先求出起点到所有点的最短距离和所有点到终点的最短距离(两次DIjkstra,第二次跑反向边即可),并建出最短路图。设ds[u]为起点到点u的最短距离,dt[u]为点u到终点的最短距离,对于每条边,设该边的两个端点u->v,以及边权c,分情况讨论:
若ds[v]+c+dt[u]>dt[s],此时将边取反后最短距离减小,否则需要判断该边是否为最短路图上s到t的割边,若是则最短距离增加,否则不变。
如何判断该边是否为s到t的割边?其实方法很简单,如果是割边,那么从s到t的所有路径都经过该边。由于最短路图是个DAG,设in[u]表示从起点走到u的路径数,out[v]表示从v走到终点的路径数,则每条边被通过的路径数=in[u]*out[v],只需判断in[u]*out[v]是否等于out[s]即可。注意这个路径数可能会很大甚至存不下,但由于只需要判断是否相等用哈希就可以,可以用unsigned long long溢出自动取模。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N=1e5+,inf=0x3f3f3f3f;
int n,m,hd[N],ne;
ll in[N],out[N],ds[N],dt[N],vis[N];
struct E {int u,v,c,nxt;} e[N<<];
void addedge(int u,int v,int c) {e[ne]= {u,v,c,hd[u]},hd[u]=ne++;}
struct D {
int u;
ll g;
bool operator<(const D& b)const {return g>b.g;}
};
priority_queue<D> q;
void upd(int u,ll ad,ll* dp) {
if(dp[u]>ad)dp[u]=ad,q.push({u,ad});
}
void dij() {
memset(ds,inf,sizeof ds);
while(q.size())q.pop();
upd(,,ds);
while(q.size()) {
int u=q.top().u;
ll g=q.top().g;
q.pop();
if(ds[u]!=g)continue;
for(int i=hd[u]; ~i; i=e[i].nxt)if(!(i&))upd(e[i].v,g+e[i].c,ds);
}
memset(dt,inf,sizeof dt);
while(q.size())q.pop();
upd(,,dt);
while(q.size()) {
int u=q.top().u;
ll g=q.top().g;
q.pop();
if(dt[u]!=g)continue;
for(int i=hd[u]; ~i; i=e[i].nxt)if(i&)upd(e[i].v,g+e[i].c,dt);
}
}
ll dfsin(int u) {
ll& ret=in[u];
if(vis[u])return ret;
vis[u]=,ret=;
if(u==)return ret=;
for(int i=hd[u]; ~i; i=e[i].nxt)if(i&) {
int v=e[i].v;
if(dt[u]+e[i].c!=dt[v])continue;
ret+=dfsin(v);
}
return ret;
}
ll dfsout(int u) {
ll& ret=out[u];
if(vis[u])return ret;
vis[u]=,ret=;
if(u==)return ret=;
for(int i=hd[u]; ~i; i=e[i].nxt)if(!(i&)) {
int v=e[i].v;
if(ds[u]+e[i].c!=ds[v])continue;
ret+=dfsout(v);
}
return ret;
}
int main() {
memset(hd,-,sizeof hd),ne=;
scanf("%d%d",&n,&m);
while(m--) {
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
addedge(u,v,c);
addedge(v,u,c);
}
dij();
memset(vis,,sizeof vis);
for(int i=; i<=n; ++i)dfsin(i);
memset(vis,,sizeof vis);
for(int i=; i<=n; ++i)dfsout(i);
for(int i=; i<ne; i+=) {
int u=e[i].u,v=e[i].v;
if(dt[]>ds[v]+e[i].c+dt[u])puts("HAPPY");
else if(ds[u]+e[i].c==ds[v]&&in[u]*out[v]==out[])puts("SAD");
else puts("SOSO");
}
return ;
}
Aizu - 1383 Pizza Delivery (最短路图+DAG上的割边)的更多相关文章
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- Vulnerable Kerbals CodeForces - 772C【拓展欧几里得建图+DAG上求最长路】
根据拓展欧几里得对于同余方程 $ax+by=c$ ,有解的条件是 $(a,b)|c$. 那么对于构造的序列的数,前一个数 $a$ 和后一个数 $b$ ,应该满足 $a*x=b(mod m)$ 即 $ ...
- Pizza Delivery
Pizza Delivery 时间限制: 2 Sec 内存限制: 128 MB 题目描述 Alyssa is a college student, living in New Tsukuba Cit ...
- [NOIP2017]逛公园 最短路图 拓扑序DP
---题面--- 题解: 挺好的一道题. 首先我们将所有边反向,跑出n到每个点的最短路,然后f[i][j]表示从i号节点出发,路径长比最短路大j的方案数. 观察到,如果图中出现了0环,那么我们可以通过 ...
- 【暑假】[深入动态规划]UVa 1628 Pizza Delivery
UVa 1628 Pizza Delivery 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51189 思路: ...
- [HAOI2012]道路(最短路DAG上计数)
C国有n座城市,城市之间通过m条[b]单向[/b]道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我们需要对每 ...
- 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)
题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...
- codeforces Gym 100338C Important Roads (重建最短路图)
正反两次最短路用于判断边是不是最短路上的边,把最短路径上的边取出来建图.然后求割边.注意重边,和卡spfa. 正权,好好的dijkstra不用,用什么spfa? #include<bits/st ...
- Codeforces Round #545 (Div. 2) E 强连通块 + dag上求最大路径 + 将状态看成点建图
https://codeforces.com/contest/1138/problem/E 题意 有n个城市(1e5),有m条单向边(1e5),每一周有d天(50),对于每个城市假如在某一天为1表示这 ...
随机推荐
- 最新 苏宁java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.苏宁等10家互联网公司的校招Offer,因为某些自身原因最终选择了苏宁.6.7月主要是做系统复习.项目复盘.LeetCode ...
- vue 解决jsonp跨域
在Vue中使用jsonp 参考链接:https://blog.csdn.net/m0_38134431/article/details/87930647 在vue中使用vue-jsonp 参考链接:h ...
- Linux 中文man手册安装
首先需要确认的是有没有安装中文支持,如果没有请安装:#yum groupinstall -y "Chinese Support" 现在下载安装包: wget http://manp ...
- Netty学习篇②
Channel.ChannelPipeline.ChannelHandlerContent发送数据的不同 // channel往回写数据 Channel channel = ctx.channel() ...
- select示例
#include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include < ...
- Oracle学习记录(一)
一.Oracle历史 于1977年拉里埃里森和他三个朋友成立了软件研发公司,并在之后给中央情报局开发了命名为Oracle而出名,并在之后将公司名改为Oracle.1989年以甲骨文命名进入中国. Or ...
- ES-实战
一.环境准备 操作系统:mac 依赖的软件:JDK1.8.Postman.NodeJs6.0以上.Maven.Idea ES下载:Elastic官方网站: http://www.elastic.co ...
- Windows一键设置环境变量(以设置java环境变量为例)
右击以管理员方式运行 JDKSetting.bat @echo off color 0a echo.------------------------------------ echo.TODO:设 ...
- js 替换html
function getInfo(){ var player_name=$("#name").val(); $.ajax({ url: 'get_wefare', method: ...
- 阿里云 负载均衡 HTTP转HTTPS
一.相关文档 1.证书服务 2.简单路由-HTTP 协议变为 HTTPS 协议 二.阿里云操作界面 1.云盾证书服务管理控制台(查询CA证书服务) 2.负载均衡管理控制台 三.相关文档 1.Syman ...