题意:给你一个有向图,每一条边在第i天都会反向,问反向后的最短路是否有变化。每次反向都是独立的。

解题思路:我们先把起点到所有点的最短路求出来,然后把所有边反向,然后求终点到所有点的最短路。

这样我们就记录了两个数组d1,d2,分别记录起点和终点到所有点的最短路。然后用s记录刚开始的最短路。当我们反向一条边的时候只需要判断 d1[v]+d2[u]+w<s,如果小于s,那么肯定是happy,否则可能是sad也可能是soso,这时只要判断这条边是否是最短路的必经边即可,如果是必经边,肯定是sad,否则就是soso。

那么怎么判断是否是必经边呢?只要枚举每一条边,把每一条边反向,看看最短路是否会发生变化,不会发生变化的话,就有可能是必经边,把他变成无向边,放到一个图里,最后对这个图求桥,求出的桥都是必经边,其他的都是非必经边。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=2e5+5;
struct node{int nxt,u,v,w;
};
bool bi[maxn];//保存是否是必经边
struct Graph{struct Node{int v;long long dis;Node (long long a,int b):dis(a),v(b){};bool operator<(const Node &a)const{return dis>a.dis;}};node edge[maxn];int tot=0;int head[maxn],id[maxn];bool vis[maxn];long long d[maxn];Graph(){memset(head,-1,sizeof(head));}void add(int u,int v,int w){edge[tot]={head[u],u,v,w};head[u]=tot++;}void add(int u,int v,int w,int _id){edge[tot]={head[u],u,v,w};id[tot]=_id;head[u]=tot++;}void dijkstra(int S){priority_queue<Node>Q;memset(d,0x3f,sizeof(d));memset(vis,0,sizeof(vis));d[S]=0;Q.push(Node(d[S],S));while (!Q.empty()){Node t=Q.top();Q.pop();int v=t.v;if (vis[v]) continue;vis[v]=1;for (int i=head[v];~i;i=edge[i].nxt){if (d[edge[i].v]>d[v]+edge[i].w){d[edge[i].v]=d[v]+edge[i].w;Q.push(Node(d[edge[i].v],edge[i].v));}}}}int vistime=0;int dfn[maxn],low[maxn];void tarjan(int v,int u){dfn[v]=low[v]=++vistime;for (int i=head[v];~i;i=edge[i].nxt){if (!dfn[edge[i].v]){tarjan(edge[i].v,v);low[v]=min(low[v],low[edge[i].v]);if (low[edge[i].v]>dfn[v])bi[id[i]]=1;//桥肯定是必经边}elseif (edge[i].v!=u)low[v]=min(low[v],dfn[edge[i].v]);}}
}G1,G2,G3;
int n,m,u,v,w;
int main(){scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);G1.add(u,v,w);G2.add(v,u,w);}G1.dijkstra(1);G2.dijkstra(2);long long s=G1.d[2];for (int i=0;i<G1.tot;i++){u=G1.edge[i].u;v=G1.edge[i].v;w=G1.edge[i].w;if (G1.d[u]+G2.d[v]+w==s){G3.add(u,v,w,i);G3.add(v,u,w,i);}}G3.tarjan(1,0);for (int i=0;i<G1.tot;i++){u=G1.edge[i].u;v=G1.edge[i].v;w=G1.edge[i].w;if (G1.d[v]+G2.d[u]+w<s){printf("HAPPY\n");}else if (bi[i])printf("SAD\n");else printf("SOSO\n");}return 0;
} 

.

Gym - 101986F Pizza Delivery (最短路必经路径)相关推荐

  1. Gym - 101986F Pizza Delivery(最短路+DAG必经边)

    题目链接:点击查看 题目大意:给出一个n个点m条边的有向无环图,每条边的权重为w,起点为1,终点为2,现在对每一条边询问: 若将该边的方向取反,权值不变,则对最短路有无影响,分为三种情况讨论: 若最短 ...

  2. HDU - 3571 HDU CakeMan(bfs+最短路必经点)

    题目链接:点击查看 题目大意:给出一个n*m的地图: 'D'表示小贩 'S'表示小贩的家 'C'表示城管 'X'表示墙 '.'表示路 '数字'表示小贩需要多停留几秒钟 现在城管发现了小贩,小贩会选择任 ...

  3. 【Gym - 101986F】Pizza Delivery(Dijkstra最短路,建图方式,反向建图,Tarjan求桥,图论模板)

    题干: 题目大意: 一个有向图,编号1~n的n个点,m条边,规定1为起点,2为终点,问对于每一条边,反转它的方向,最短路会不会发生改变,如果变短了,输出HAPPY,变长了或者到达不了了输出SAD,不变 ...

  4. 算法提高课-搜索-最短路模型-AcWing 1076. 迷宫问题:bfs最短路、路径

    题目分析 分析: bfs求最短路,主要原因是因为bfs是一层一层的搜,当第一次搜到终点的时候,其实就是到终点的最短路. 本题bfs倒着搜,从终点(n-1,n-1)开始搜,记录到每个点的路径nxt[][ ...

  5. 【CCCC】L3-014 周游世界 (30分),,DFS搜索最短路,路径打印

    problem L3-014 周游世界 (30分) 周游世界是件浪漫事,但规划旅行路线就不一定了-- 全世界有成千上万条航线.铁路线.大巴线,令人眼花缭乱.所以旅行社会选择部分运输公司组成联盟,每家公 ...

  6. 最短路:求最长最短路,求最短路的路径

    枚举删边跑Dijskra HDU - 1595 find the longest of the shortest #include <set> #include <map> # ...

  7. 最短路:路径还原(dijkstra,模板)

    B. wzy的大冒险--出发咯QAQ 单点时限: 2.0 sec 内存限制: 512 MB wzy踏上了冒险的旅程. 现在他从地精手里买了一份地图,地图上有n个城镇. 他从第一个城镇出发,走向(没钱只 ...

  8. BFS最短路打印路径

    Problem Description 2020级的新生即将来USST报道了,学校规定报道地点定在了516号的老体育馆. 现在为了方便新生报道,Wiki自我推荐为新生绘制一张校园地图.地图功能很简单: ...

  9. 维护点权最大的最短路+输出路径

    作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...

最新文章

  1. 【luogu 3375】【模板】KMP字符串匹配
  2. iphone分辨率_iPhone 的屏幕为什么比安卓更丝滑?
  3. python 特征选择 绘图 + mine
  4. 2.1 网站防******与企业虚拟化需求分析
  5. php项目技术选型方案,php-现有资源下,项目技术选型求助
  6. 2020最新Java线程池入门(超详细)
  7. linux定时创建文件,linux下如何创建定时任务
  8. 电脑如何设置不休眠_电脑休眠了却没法唤醒?设置一下就好!
  9. 判断Logger级别是否开启的方法
  10. 想要成为一名优秀的程序员?这8本书告诉你
  11. 敏感词过滤算法对比,顺便开源了个工具库
  12. linux两台服务器文件实时同步
  13. 网易云通讯与视频_总结_00_资源帖
  14. 网络安全学习第14篇 - 游戏(仙剑奇侠传95)外挂之修改游戏资源文件(修改人物属性)
  15. 3ds Max2021软件安装包+安装教程
  16. java libtorrent_基于libtorrent最简单的BT下载程序 | 学步园
  17. 软件开发人员是一种很棒的职业选择的五大理由
  18. 未来10年,软件开发技术的8个发展趋势
  19. 故障排除经验——笔记本电脑重启后键盘失灵的解决办法(亲测可用)
  20. 为何64位的.NET程序不能申请超过2G的空间

热门文章

  1. 人才测评之计划能力,如何提高计划能力?
  2. MySQL数据库相关资料
  3. SSH免密失败并报错:no mutual signature algorithm
  4. Ubuntu 完全卸载软件常用命令
  5. 数据库模型设计——历史表与版本号设计
  6. Mac 重置 idea
  7. 电脑重装:微PE工具箱重装win10系统
  8. 无人车“看世界”的底层逻辑——概率密度与贝叶斯法则
  9. 解密:LL与LR解析 1(译)
  10. 怎么搭建自己的内测分发平台?