题意:与poj3268一样,所有人需要从各点到一点再从一点到各点,求最短路总和。

与poj3268一样,先正向建图跑 dijkstra ,得到该点到其他所有各点的最短路,即这些人回去的最短路,再用反向建的图跑一遍最短路,得到各点到该点的最短路,求和就行了。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<vector>
 6 using namespace std;
 7 typedef pair<int,int> pii;
 8 typedef long long ll;
 9 const int MAXM=1000000;
10 struct cmp{
11     bool operator ()(pii a,pii b){
12         return a.first>b.first;
13     }
14 };
15
16 int head1[MAXM+5],point1[MAXM+5],val1[MAXM+5],next1[MAXM+5],size1;
17 int head2[MAXM+5],point2[MAXM+5],val2[MAXM+5],next2[MAXM+5],size2;
18 int n,m;
19 int dist1[MAXM+5],dist2[MAXM+5];
20
21 void add1(int a,int b,int v){
22     point1[size1]=b;
23     val1[size1]=v;
24     next1[size1]=head1[a];
25     head1[a]=size1++;
26 }
27
28 void add2(int a,int b,int v){
29     point2[size2]=b;
30     val2[size2]=v;
31     next2[size2]=head2[a];
32     head2[a]=size2++;
33 }
34
35 void dij(int s){
36     int i;
37     priority_queue<pii,vector<pii>,cmp>q;
38     memset(dist1,0x3f,sizeof(dist1));
39     memset(dist2,0x3f,sizeof(dist2));
40     dist1[s]=dist2[s]=0;
41     q.push(make_pair(dist1[s],s));
42     while(!q.empty()){
43         pii u=q.top();
44         q.pop();
45         if(u.first>dist1[u.second])continue;
46         for(i=head1[u.second];~i;i=next1[i]){
47             int j=point1[i];
48             if(dist1[j]>dist1[u.second]+val1[i]){
49                 dist1[j]=dist1[u.second]+val1[i];
50                 q.push(make_pair(dist1[j],j));
51             }
52         }
53     }
54     while(!q.empty())q.pop();
55     q.push(make_pair(dist2[s],s));
56     while(!q.empty()){
57         pii u=q.top();
58         q.pop();
59         if(u.first>dist2[u.second])continue;
60         for(i=head2[u.second];~i;i=next2[i]){
61             int j=point2[i];
62             if(dist2[j]>dist2[u.second]+val2[i]){
63                 dist2[j]=dist2[u.second]+val2[i];
64                 q.push(make_pair(dist2[j],j));
65             }
66         }
67     }
68     ll ans=0;
69     for(i=1;i<=n;i++){
70         ans+=dist1[i];
71         ans+=dist2[i];
72     }
73     printf("%I64d\n",ans);
74 }
75
76 int main(){
77     int t;
78     scanf("%d",&t);
79         for(int q=1;q<=t;q++){
80             scanf("%d%d",&n,&m);
81             int i,a,b,v;
82             memset(head1,-1,sizeof(head1));
83             size1=0;
84             memset(head2,-1,sizeof(head2));
85             size2=0;
86             for(i=1;i<=m;i++){
87                 scanf("%d%d%d",&a,&b,&v);
88                 add1(a,b,v);
89                 add2(b,a,v);
90             }
91             dij(1);
92         }
93
94     return 0;
95 }

View Code

转载于:https://www.cnblogs.com/cenariusxz/p/4785251.html

poj1511 最短路相关推荐

  1. poj1511 InvitationCards 最短路 Dijkstra堆优化

    第一反应想到和 poj3268做法一样,先是从起点dj,然后将图反向,再次dj一次,求和即可.但是,数据O(n*n)过不去,所以需要使用dijkstra的堆优化! 淦,没用scanf结果超时了= = ...

  2. [C] [最短路] 只有5行的算法:Floyd-Warshall

    终于学到求最短路了,终于来到我最喜欢的算法--Floyd-Warshall了!今天还有点小激动呢! 我喜欢它,当然是因为它逻辑十分简单咯!真的只有5行诶! Floyd-Warshall算法 题目描述 ...

  3. BZOJ4152 AMPPZ2014 The Captain(最短路)

    事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案.于是这样连边跑最短路就可以了. #include<iostream> #include<cstdio> #inclu ...

  4. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  5. BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)

    Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2343  Solved: 1266 [Submit][Status][Discuss] Descrip ...

  6. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  7. E:By Elevator or Stairs? CF595 DP最短路

    题目链接 比赛的时候一看,这不是最短路吗,然后敲了一个最短路. 然后比赛完发现大家基本都写的dp,我真是个憨憨,dp3行 最短路就建个简单的图,dp就是从上一维转化过来就是了 优秀的dp: //#pr ...

  8. The Shortest Statement CodeForces - 1051F LCA+最短路

    太弱了... 一开始看到题感觉是跑一个最小生成树在上边进行LCA就行了,但是发现过不了样例,然后就是就想到了之前做过类似做法的题目,就是非生成树上的边最多只有21条,然后就那些边记录下来,通过每一条边 ...

  9. JZOJ #4722 跳楼机 (最短路模型的完美转化)

    题目描述: 给出$h,x,y,z$,求在$h$以内,$x,y,z$可以凑出多少个不同的数.$(1\leq{h}\leq{10^{18}},1\leq{x,y,z}\leq{10^5})$ 解题思路: ...

  10. matlab单机无限大系统_基于MATLAB的单机无穷大系统短路故障分析_吕鹏

    _______________________________电子技术__丝I 基于MA丁LAB的单机无穷大系统短路故障分析 山东科技大学吕鹏钟家成纪妮妮李漫漫 [摘要]本z l),NIATLAB7. ...

最新文章

  1. create-react-app 2.0中使用antd(eject)
  2. 撒花!算法岗必须复现的上百篇经典论文代码完结啦! | 附下载链接
  3. C语言简单题-找最大的字符串
  4. 百度Ueditor编辑器wordimage踩坑
  5. 计算机网络——物理层设备
  6. htm怎么让图片和搜索框在同一行_对于优化来说,内链应该怎么使用你知道吗?...
  7. Web前端开发技术概述
  8. 矩阵分析_二阶矩阵A为酉矩阵的充分必要条件是A为下列三种形式之一
  9. Xshell脚本实现自动登陆||自动登陆的几种方式。
  10. Datax-web版安装(含安装包)
  11. MVC中的ViewData、ViewBag和TempData
  12. 从尾到头打印链表(C++和Python 实现)
  13. 【JS】常用js方法
  14. barrier linux,Linux Barrier I/O 实现分析笔记
  15. 随机事件的关系及运算
  16. Vue项目提高页面加载速度的方法
  17. 同程旅游——Java开发面经
  18. HTML样式中移动鼠标到指定位置改变光标形状
  19. GB 50312-2007 综合布线工程验收规范(含条文说明)
  20. 自助下单彩虹云商城系统2023最新免授权独立版源码安装教程

热门文章

  1. PHP比较两个时间戳相差天时分秒
  2. 利用ajax查询数据库显示在前台,ajax动态查询数据库数据并显示在前台的方法
  3. Matlab函数——wgn
  4. 修改JDK的经历:两处字体的粗体代码引起的错误
  5. onfigure: error: cannot find install-sh, install.sh, or shtool in
  6. configure: error: Can‘t find ext2fs library
  7. 代码管理学:安排新员工看代码,因为主管不会管理,不负责任
  8. LINUX打印机报错:ipp error(1034, client-error-document-format-not-supported)
  9. LINUX搭建EtherCalc环境
  10. LINUX上安装openjdk