题意:给n个点m条边的有向图。每次使一条边反向,问你1到2的最短路变短,变长,还是不变。

解法:遇到这种题容易想到正向求一遍最短路d1,反向再求一遍最短路d2。纪录原图上的最短路为ans,然后分开考虑各种情况。

变短的情况:d1[y[i]]+d2[x[i]]+z[i]<ans

否则就剩下不变和变长两种情况:那么如果边(x,y)是起点到终点的最短路必须边的话,就会变长,否则会不变。

接下来的问题是  怎么求最短路的必经边?

求出原图1到2最短路图(这里要和求单源点的最短路图区别开来,单源点的最短路图使起点到所有其他点的最短路的集合),求法:如果d1[x[i]]+z[i]+d2[y[i]]==ans的话边(x[i],y[i])就在起点到终点的最短路图上。  把这个图变为无向图,用tarjan求桥。如果边(x,y)是桥的话就是必经边,否则为非必经边。

细节详见代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> pii;
const int N=1e5+;
LL n,m,ans;
LL d1[N],d2[N],x[N],y[N],z[N]; LL cnt=,head[N],to[N<<],nxt[N<<],len[N<<];
void add_edge(LL x,LL y,LL z) {
nxt[++cnt]=head[x]; to[cnt]=y; len[cnt]=z; head[x]=cnt;
} bool vis[N];
priority_queue<pii> q;
void Dijkstra(LL d[],LL s) {
while (!q.empty()) q.pop();
memset(vis,,sizeof(vis));
d[s]=; q.push(make_pair(,s));
while (!q.empty()) {
pii x=q.top(); q.pop();
if (vis[x.second]) continue;
vis[x.second]=;
for (LL i=head[x.second];i;i=nxt[i]) {
LL y=to[i];
if (d[y]>d[x.second]+len[i]) {
d[y]=d[x.second]+len[i];
q.push(make_pair(-d[y],y));
}
}
}
} int num,low[N],dfn[N],bridge[N];
void tarjan(int x,int in) {
dfn[x]=low[x]=++num;
for (int i=head[x];i;i=nxt[i]) {
int y=to[i];
if (!dfn[y]) {
tarjan(y,i);
low[x]=min(low[x],low[y]); if (low[y]>dfn[x])
bridge[len[i]]=bridge[len[i^]]=;
} else if (i!=(in^))
low[x]=min(low[x],dfn[y]);
}
} void getbridge() {
cnt=; memset(head,,sizeof(head));
for (int i=;i<=m;i++)
if (d1[x[i]]+z[i]+d2[y[i]]==ans)
add_edge(x[i],y[i],i),add_edge(y[i],x[i],i);
for (int i=;i<=n;i++)
if (!dfn[i]) tarjan(i,);
} int main()
{
cin>>n>>m;
for (int i=;i<=m;i++) scanf("%lld%lld%lld",&x[i],&y[i],&z[i]); memset(d1,0x3f,sizeof(d1)); memset(d2,0x3f,sizeof(d2));
for (int i=;i<=m;i++) add_edge(x[i],y[i],z[i]);
Dijkstra(d1,); cnt=; memset(head,,sizeof(head));
for (int i=;i<=m;i++) add_edge(y[i],x[i],z[i]);
Dijkstra(d2,); ans=d1[]; getbridge(); for (int i=;i<=m;i++)
if (ans>d1[y[i]]+d2[x[i]]+z[i]) puts("HAPPY");
else if (bridge[i]) puts("SAD"); else puts("SOSO");
return ;
}

(好题)2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest F Pizza Delivery的更多相关文章

  1. 2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest

    2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest A Secret of Chocolate Poles 思路:暴力枚举黑巧克力的个数和厚黑巧克力的个 ...

  2. ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków

    ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...

  3. 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)

    2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...

  4. Gym101986: Asia Tsukuba Regional Contest(寒假自训第12场)

    A .Secret of Chocolate Poles 题意:有黑白两种木块,黑色有1,K两种长度: 白色只有1一种长度,问满足黑白黑...白黑形式,长度为L的组合种类. 思路:直接DP即可. #i ...

  5. 2018 ICPC Asia Jakarta Regional Contest

    题目传送门 题号 A B C D E F G H I J K L 状态 Ο . . Ο . . Ø Ø Ø Ø . Ο Ο:当场 Ø:已补 .  :  待补 A. Edit Distance Thin ...

  6. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

  7. Gym - 101981M The 2018 ICPC Asia Nanjing Regional Contest M.Mediocre String Problem Manacher+扩增KMP

    题面 题意:给你2个串(长度1e6),在第一个串里找“s1s2s3”,第二个串里找“s4”,拼接后,是一个回文串,求方案数 题解:知道s1和s4回文,s2和s3回文,所以我们枚举s1的右端点,s1的长 ...

  8. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律

    题面 题意:数一个n阶三角形中,有多少个全等三角形,n<=1e9 题解:拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0), ...

  9. Gym - 101981I The 2018 ICPC Asia Nanjing Regional Contest I.Magic Potion 最大流

    题面 题意:n个英雄,m个怪兽,第i个英雄可以打第i个集合里的一个怪兽,一个怪兽可以在多个集合里,有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 题解:显 ...

随机推荐

  1. PHP应该学什么,如何学好PHP

    http://blog.sina.com.cn/s/blog_76bdabf70101azl4.html(注:原文来自传智播客) 本文转自http://blog.sina.com.cn/s/blog_ ...

  2. kvm的img文件的本机挂载

    非lvm分区挂载方法: mount -o loop xxx.img /mnt/xxx 系统提示: “mount: you must specify the filesystem type” 执行:fd ...

  3. 力扣 ——Linked List Cycle II(环形链表 II) python实现

    题目描述: 中文: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). ...

  4. 斯特林数&斯特林反演

    第一类斯特林数 定义 第一类Stirling数\(s(n,m)\),也可记为\(\begin{bmatrix}n\\m\end{bmatrix}\). 第一类Stirling分为无符号第一类Stirl ...

  5. tensorflow报错

    libcublas.so.9.0: cannot open shared object file: No such file or directory 输入命令: sudo ldconfig/usr/ ...

  6. UNP学习第八章udp

    一.基本UDP套接口编程 #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, i ...

  7. hdu 6085 Rikka with Candies (set计数)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  8. Codeforces 789e The Great Mixing (bitset dp 数学)

    Sasha and Kolya decided to get drunk with Coke, again. This time they have k types of Coke. i-th typ ...

  9. 「NOI2016」网格 解题报告

    「NOI2016」网格 容易注意到,答案最多为2,也就是说答案为-\(1,0,1,2\)四种,考虑逐个判断. 无解的情况比较简单 如果\(nm\le c+1\),显然无解 如果\(nm=c+2\),判 ...

  10. Python基础教程(003)--Python的设计目标

    前言 了解Python的设计目标,这节是了解Python的背景,不需要掌握,但是需要你知道有这个东西.就是Python的目的是什么.作者开发这个Python语言的目的是什么. 知识点 一门简单直观的语 ...