题意:

在有向加权图中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+;
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=;i<=n;i++)//清空邻接表
{
G[i].clear();
}
edges.clear();//清空边表
}
void AddEdge(int from,int to,int dist)
{
//如果是无向图,每条无向边需调用2次AddEdge
edges.push_back((Edge){from,to,dist});
m=edges.size();
G[from].push_back(m-);
}
void dijkstra(int s)
{//求s到所有点的距离
priority_queue<HeapNode> Q;
for(int i=;i<=n;i++)d[i]=INF;
d[s]=;
memset(done,,sizeof(done));
Q.push((HeapNode){,s});
while(!Q.empty())
{
HeapNode x=Q.top();Q.pop();
int u=x.u;
if(done[u])continue;
done[u]=true;
for(int i=;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=;i<=n;i++)
O_G[i].clear();
O_edges.clear();
for(int i=;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()-;
O_G[b].push_back(mm);
}
solver.dijkstra();
int ans=;
for(int i=;i<=n;i++)
ans+=solver.d[i];
for(int i=;i<=n;i++)
solver.G[i]=O_G[i];
solver.edges=O_edges;
solver.dijkstra();
for(int i=;i<=n;i++)
ans+=solver.d[i];
printf("%d\n",ans);
}
return ;
}

ZOJ-2008-Invitation Cards(dijkstra)的更多相关文章

  1. POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)

    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...

  2. POJ 1511 - Invitation Cards (dijkstra优先队列)

    题目链接:http://poj.org/problem?id=1511 就是求从起点到其他点的最短距离加上其他点到起点的最短距离的和 , 注意路是单向的. 因为点和边很多, 所以用dijkstra优先 ...

  3. POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))

    题目链接:http://poj.org/problem?id=1511 题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9.问你从起点到各个点以及从各个 ...

  4. HDU1535——Invitation Cards(最短路径:SPAF算法+dijkstra算法)

    Invitation Cards DescriptionIn the age of television, not many people attend theater performances. A ...

  5. HDU 1535 Invitation Cards(逆向思维+邻接表+优先队列的Dijkstra算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 Problem Description In the age of television, n ...

  6. POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 16178   Accepted: 526 ...

  7. HDU 1535 Invitation Cards(最短路 spfa)

    题目链接: 传送门 Invitation Cards Time Limit: 5000MS     Memory Limit: 32768 K Description In the age of te ...

  8. poj1511/zoj2008 Invitation Cards(最短路模板题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Invitation Cards Time Limit: 5 Seconds    ...

  9. POJ1511:Invitation Cards(最短路)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 34743   Accepted: 114 ...

  10. hdu1535——Invitation Cards

    Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

随机推荐

  1. 第一篇:python基础

    python基础   python基础 本节内容 python起源 python的发展史 为什么选择python3 第一个python程序 变量定义 表达式和运算符 用户输入 流程控制 判断 流程控制 ...

  2. jQuery循环给某个ID赋值

    1.id名为sl的input框循环赋值 $("input[id=sl]").each(function(){alert(this.value) })

  3. 绝对炫的幻灯片插件-SKITTER

    绝对炫的幻灯片插件-SKITTER 所属分类:媒体-幻灯片和轮播图,图片展示,滑块和旋转 Includes code source // Styles <link href="css/ ...

  4. 知识点摸清 - - position属性值之relative与absolute

    两者共同特点是: 改变文档流 激活元素left.top.right.bottom.z-index属性 让元素”浮起来“,z-index>0 不同的是: 1.position:relative 会 ...

  5. C++ 简单的入门语法

    入门的hello world using namespace std; 是使用命名空间,有点像java里面的引入包main 方法和java一样是主入口,有且只有一个,因为是int ,所以还必须返回一个 ...

  6. Linux gvim windows 版本配置

    http://www.cnblogs.com/xiekeli/archive/2012/08/13/2637176.html 资源在我的网盘里面

  7. Android OpenGL ES 3.0 纹理应用

    本文主要演示OpenGL ES 3.0 纹理演示.接口大部分和2.0没什么区别,脚本稍微有了点变化而已. 扩展GLSurfaceView package com.example.gles300; im ...

  8. iis6 下发布MVC2项目的方法

    1.安装MVC2运行库,否则会出现错误 [以下转载]http://blog.csdn.net/xw13106209/article/details/6323695 错误:”未能加载文件或程序集“Sys ...

  9. install erlang environment on centos

    #(erlide in linux can't detect the runtime if build from source, but erlang shell works correctly)su ...

  10. UIView下使用Animation控制动画

    转载自:http://blog.csdn.net/xunyn/article/details/8128031 动画效果是IOS界面重要的特色之一,其中CAAnimation是所有动画对象的抽象父类,作 ...