POJ 1511 Invitation Cards(最短路径,dijkstra 模板题)
题目意思:
在有向图中,求1到所有点的最短路之和 + 所有点到1的最短路之和。
本题要点:
1、先求1点 到其他点的单源最短路径 d[i](1 <= i <= n), 用 dijkstra 算法 和 堆实现。 求出距离的总和 sum。
2、每条路径的方向取反,再求一次 点 1 的单源路径 d1[i](1 <= i <= n), 求出距离的总和 sum1.
答案就是 sum + sum1;
这里为了避免传参,直接写了两遍 dijkstra 算法。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MaxN = 1000010;
int n, m, T, tot, tot1;
int head[MaxN], ver[MaxN], edge[MaxN], Next[MaxN], d[MaxN];
bool vis[MaxN];
int head1[MaxN], ver1[MaxN], edge1[MaxN], Next1[MaxN], d1[MaxN];
bool vis1[MaxN];void add(int x, int y, int z)
{ver[++tot] = y, edge[tot] = z, Next[tot] = head[x]; head[x] = tot;
}void add1(int x, int y, int z)
{ver1[++tot1] = y, edge1[tot1] = z, Next1[tot1] = head1[x]; head1[x] = tot1;
}long long dijkstra()
{memset(d, 0x3f, sizeof d);memset(vis, false, sizeof vis);d[1] = 0;priority_queue<pair<int, int> > q;q.push(make_pair(0, 1));while(q.size()){int x = q.top().second; q.pop();if(vis[x]) continue;vis[x] = true;for(int i = head[x]; i; i = Next[i]){int y = ver[i], z = edge[i];if(d[y] > d[x] + z){d[y] = d[x] + z;q.push(make_pair(-d[y], y));}}}long long ans = 0;for(int i = 1; i <= n; ++i){ans += d[i];}return ans;
}long long dijkstra1()
{memset(d1, 0x3f, sizeof d1);memset(vis1, false, sizeof vis1);d1[1] = 0;priority_queue<pair<int, int> > q;q.push(make_pair(0, 1));while(q.size()){int x = q.top().second; q.pop();if(vis1[x]) continue;vis1[x] = true;for(int i = head1[x]; i; i = Next1[i]){int y = ver1[i], z = edge1[i];if(d1[y] > d1[x] + z){d1[y] = d1[x] + z;q.push(make_pair(-d1[y], y));}}}long long ans = 0;for(int i = 1; i <= n; ++i){ans += d1[i];}return ans;
}int main()
{scanf("%d", &T);while(T--){tot = tot1 = 0;memset(head, 0, sizeof head);memset(head1, 0, sizeof head1);memset(Next, 0, sizeof Next);memset(Next1, 0, sizeof Next1);scanf("%d%d", &n, &m);for(int i = 1; i <= m; ++i){int x, y, z;scanf("%d%d%d", &x, &y, &z);add(x, y, z);add1(y, x, z);}printf("%lld\n", dijkstra() + dijkstra1());}return 0;
}/*
2
2 2
1 2 13
2 1 33
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50
*//*
46
210
*/
POJ 1511 Invitation Cards(最短路径,dijkstra 模板题)相关推荐
- POJ 1511 Invitation Cards——Dijkstra优先队列优化+反向建图
[题目描述] In the age of television, not many people attend theater performances. Antique Comedians of M ...
- POJ 1511 Invitation Cards(双向最短路)
[题目链接] http://poj.org/problem?id=1511 题目意思 给n个点,m条有向边.问你从1到其他n-1各点的最短路和加上从n-1各点到1的最短路. 解题思路 因为是有向边而且 ...
- poj 1511 Invitation Cards
最短路 题意: 强调是有向图 , n个点(1到n标号)m条边,求出点1到所有点的最短路之和 + 所有点到点1的最短路之和 什么?求一次最短路,然后 x 2 就是答案? 这样是错的,如果是无向图的话可 ...
- 【POJ - 1511】 Invitation Cards(Dijkstra + 反向建图 多源到单源最短路的处理)
题干: In the age of television, not many people attend theater performances. Antique Comedians of Mali ...
- POj 3164 Command Network最小树形图 模板题 朱刘算法
Command Network After a long lasting war on words, a war on arms finally breaks out between littleke ...
- Dijkstra模板题——单源最短路径(洛谷 P3371)
题目选自洛谷P3371 这个数据类型可以将两个数据进行打包,比如 pair<int,int> 就是将两个int型进行打包. 而且使用优先队列时,优先队列会根据你打包的第一个数据进行排序. ...
- HDU 2544最短路dijkstra模板题
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- pku 1511 Invitation Cards
一道好题,练习静态表(邻接矩阵的数组开不下),没写过静态表,参考http://www.cnblogs.com/cykun/archive/2011/01/19/1939542.html 写的,改用st ...
- 城市平乱 (dijkstra模板题)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=115 本题求单源最短路,这里有个技巧,因为源点不一,这时我们可以设置一个"超级源 ...
最新文章
- 机器学习中的线性回归,你理解多少?
- linux程序设计——运行SQL语句(第八章)
- NYOJ 641 摧毁网络
- 最新版本sublime text3注册码
- 记录 之 cat 和 awk gsub 的使用
- oracle移动硬盘盒,oracle-linux下挂载移动硬盘 NTFS类型
- 实验二、XSS和SQL注入
- 动物笼行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- codeforces1013E - DP
- 服务器关机显示正在停止服务,云服务器一直停止中
- 苹果mac需牢记的SSH命令
- paip.提升用户体验------c++ 拖曳使用总结..
- 《暖暖环游世界》:突破女性休闲游戏的商业化局限
- 腾讯云带宽价格表(包年包月/按量计费/流量价格)
- 如何查看电脑是否支持CUDA及支持的CUDA版本
- 量子力学 Schrodinger 方程的简单导出
- Luna承诺简化JavaScript测试
- 关于ie浏览器的插件IEDevToolBar 和DebugBar安装问题
- 拉格朗日乘子库恩塔克条件
- iOS开源项目周报0413