有一张图,若干人要从不同的点到同一个中间点,再返回,求总费用最小

中间点到各个点最小费用是普通的最短路

各个点到中间点最小费用其实就是将所有路径反向建边之后中间点到各个点的最小费用,同样用最短路就可以求出了

 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/6592086.html

hdu1535 Invitation Cards 最短路相关推荐

  1. HDU1535 Invitation Cards(链式前向星+堆优化dijkstra)[C++]

    目录 题目及翻译 题面 输入 输出 输入样例 输出样例 题目思路 注意事项 AC代码 C++ 题目及翻译 题面 In the age of television, not many people at ...

  2. 【HDU】1535 Invitation Cards 最短路

    传送门:[HDU]1535 Invitation Cards 题目分析:题目真难读......其实题目的意思就是让求从编号为1的点到其他所有点的最短路距离之和加上其他所有点到编号为1的点的最短路距离之 ...

  3. D - Silver Cow Party J - Invitation Cards 最短路

    http://poj.org/problem?id=3268 题目思路: 直接进行暴力,就是先求出举行party的地方到每一个地方的最短路,然后再求以每一个点为源点跑的最短路. 还有一种方法会快很多, ...

  4. Invitation Cards——正反最短路

    poj 1511: Invitation Cards 题意:点1到其他点的最短距离+其他点到点1的最短距离 的总和. 1.双向建图 正向建图是1到其他点的距离,反向建图则是其他点到1的距离. 2.数据 ...

  5. 【POJ - 1511】 Invitation Cards(Dijkstra + 反向建图 多源到单源最短路的处理)

    题干: In the age of television, not many people attend theater performances. Antique Comedians of Mali ...

  6. Invitation Cards POJ - 1511【最短路】

    Invitation Cards POJ - 1511 题目 思路:建两张图,一张正向一张反向,先在正向图里求一遍一号点到所有点的距离,再在反向图里求一遍,反向图里一号点到所有点的距离的意思是所有点到 ...

  7. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))

    题目大意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费.有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到了晚上再返回点 ...

  8. Invitation Cards(建反图 + 跑两遍SPFA)

    题目如下: In the age of television, not many people attend theater performances. Antique Comedians of Ma ...

  9. POJ 1511:Invitation Cards

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 26994   Accepted: 895 ...

最新文章

  1. 【机器学习-学习笔记】单/多变量线性回归、多项式回归、逻辑回归、过拟合、正则化
  2. 动态规划---最长公共子序列
  3. 阿里mysql数据库同步_如何对MySQL数据库中的数据进行实时同步-阿里云开发者社区...
  4. api 微信小程序组件库colorui_2020最全微信小程序UI组件库合集
  5. C/C++控制台应用程序——画三角形、圆、直线、矩形
  6. 优秀logo设计解析_优秀Logo设计!字母造型解析
  7. Windows 10 开启 Num Lock
  8. [转]为什么python标准库没有实现链表
  9. python3 yum源_Redhat7.3更换CentOS7 yum源
  10. Android实现推送PushService通知No…
  11. APSINx010HC系列射频模拟信号发生器—输出高达6.1GHz
  12. 英雄联盟——心得体会
  13. 【CodeForces】 106C Buns(多重背包)
  14. 哲理故事300篇 上
  15. 微信vue路由跳转兼容_Vue微信公众号开发踩坑记录
  16. 论文阅读:efficient and available in-memory KV-store with hybrid erasurecod and repli
  17. 颜色名称-RGB数值对照表
  18. 同态算法FHEW笔记
  19. Xshell 使用删除键乱码问题
  20. 百度开源中国(Java)面经,不看就太可惜啦

热门文章

  1. HDU 4747 Mex【线段树上二分+扫描线】
  2. vim编辑器学习记录
  3. NYOJ 745 dp
  4. 第一节 生命周期和Zend引擎
  5. Fabric 报错:java.lang.IllegalArgumentException: UserContext user‘s name missing.
  6. bootstrapTable表格分页后,处理逻辑后刷新跳回第一页,没留在当前页的解决办法
  7. SpringMVC自学日志01(回顾servlet)
  8. Spring和Mybatis整合
  9. 企业级工作流解决方案(十六)--工作流--工作流实体模型
  10. SQL2008无法连接到(local),该账户当前被锁定,所以Sa用户登陆失败