题意:

在有向加权图中G(V,E),邮局要从起点S向其他n个节点发送邮件,于是派出n个邮递员,分别到达其他n个地点发送,然后回到起点S,求出所有邮递员所经过的总路程的最小值。

分析:

正向一次dijkstra,反向一次dijkstra

// File Name: 2008.cpp
// Author: Zlbing
// Created Time: 2013年08月04日 星期日 14时18分49秒

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
using namespace std;
#define CL(x,v); memset(x,v,sizeof(x));
#define INF 0x3f3f3f3f
#define LL long long
#define REP(i,r,n) for(int i=r;i<=n;i++)
#define RREP(i,n,r) for(int i=n;i>=r;i--)
const int MAXN=1e6+100;
struct Edge{int from,to,dist;
};
struct HeapNode{int d,u;bool operator <(const HeapNode &rhs)const{return d>rhs.d;}
};
vector<int> O_G[MAXN];
vector<Edge> O_edges;
struct Dijkstra{int n,m;//点和边数vector<Edge>edges;//边列表vector<int>G[MAXN];//每个节点出发的边编号(从0开始编号)bool done[MAXN];//是否永久标记int d[MAXN];//s到各个点的距离int p[MAXN];//最短路中的上一条边void init(int n){this->n=n;for(int i=0;i<=n;i++)//清空邻接表
        {G[i].clear();}edges.clear();//清空边表
    }void AddEdge(int from,int to,int dist){//如果是无向图,每条无向边需调用2次AddEdgeedges.push_back((Edge){from,to,dist});m=edges.size();G[from].push_back(m-1);}void dijkstra(int s){//求s到所有点的距离priority_queue<HeapNode> Q;for(int i=0;i<=n;i++)d[i]=INF;d[s]=0;memset(done,0,sizeof(done));Q.push((HeapNode){0,s});while(!Q.empty()){HeapNode x=Q.top();Q.pop();int u=x.u;if(done[u])continue;done[u]=true;for(int i=0;i<G[u].size();i++){Edge& e=edges[G[u][i]];if(d[e.to]>d[u]+e.dist){d[e.to]=d[u]+e.dist;p[e.to]=G[u][i];Q.push((HeapNode){d[e.to],e.to});}}}}
};
Dijkstra solver;
int main()
{
int N;
scanf("%d",&N);while(N--){int n,m;scanf("%d%d",&n,&m);solver.init(n);int a,b,c;for(int i=0;i<=n;i++)O_G[i].clear();O_edges.clear();for(int i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);solver.AddEdge(a,b,c);O_edges.push_back((Edge){b,a,c});int mm=O_edges.size()-1;O_G[b].push_back(mm);}solver.dijkstra(1);int ans=0;for(int i=1;i<=n;i++)ans+=solver.d[i];for(int i=1;i<=n;i++)solver.G[i]=O_G[i];solver.edges=O_edges;solver.dijkstra(1);for(int i=1;i<=n;i++)ans+=solver.d[i];printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/arbitrary/p/3238291.html

ZOJ-2008-Invitation Cards(dijkstra)相关推荐

  1. POJ 1511 Invitation Cards——Dijkstra优先队列优化+反向建图

    [题目描述] In the age of television, not many people attend theater performances. Antique Comedians of M ...

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

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

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

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

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

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

  5. J - Invitation Cards POJ - 1511

    J - Invitation Cards POJ - 1511 题意: 共有 n 个站点,n 个志愿者从1 出发,分别到达不同的站点,晚上全部回到 1 ,求他们总的最小花费是多少? 思路: 首先想到从 ...

  6. 【HDU】1535 Invitation Cards 最短路

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

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

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

  8. POJ 1511:Invitation Cards

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

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

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

  10. Invitation Cards——正反最短路

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

最新文章

  1. 部署可扩展的目标检测管道:推理过程(下)
  2. Ubuntu系统创建AndroidStudio启动图标(快捷方式)
  3. Android关机流程源码分析
  4. ML之UL:无监督学习Unsupervised Learning的概念、应用、经典案例之详细攻略
  5. mysql-binlog日志恢复数据库
  6. CanFestival移植到STM32F103
  7. ClickHouse最简单的安装方法
  8. 权限申请弹框_安卓Q | 位置权限三态化解析,用户要关心,开发者须警惕!
  9. vue进入页面加载数据缓慢实现loading提示
  10. (Excel)如何使用Excel进行四舍六入数据修约
  11. 物联网应用层的关键技术有哪些
  12. 数据科学数据清理和可视化,适合使用python的初学者
  13. 由计算机病毒引起的问题属于,多数情况下由计算机病毒程序引起的问题属于()故障。A.硬件B.软件C.操作D.电源...
  14. Java中的即时编译器
  15. python 之hellow
  16. CoAP协议学习笔记 1.2 一张表了解 CoAP 协议
  17. Beta Distribution Guided Aspect-aware Graph for Aspect Category Sentiment Analysis论文阅读笔记(EMNLP2021)
  18. 最值得关注的五款睡眠监护仪:Sense、梦加上榜
  19. 华为云服务器使用教程
  20. duffing matlab,duffing方程matlab

热门文章

  1. T-SQL语句之创建、修改、删除数据库
  2. Jmeter系列之数据库操作
  3. Blockchain.com将于今日7:59暂停XRP交易
  4. SAP License:MM常用事物码
  5. 一文看懂响应率模型开发内容
  6. 伴鱼DQC数据质量平台实践
  7. Http Header的Transfer-Encoding
  8. vim编辑器常见使用
  9. C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
  10. 【XSY2718】gift 分数规划 网络流