<题目链接>

题目大意:

有向图,求从起点1到每个点的最短路然后再回到起点1的最短路之和。

解题分析:

在求每个点到1点的最短路径时,如果仅仅只是遍历每个点,对它们每一个都进行一次最短路算法,那么即使是用了堆优化的dijkstra,时间复杂度也高达$O(n^2log(n))$,而本题有1000000个点,毫无疑问,这种想法必然是不可行的,所以我们可以采用逆向思维,将图中的每一条有向边全部反向,然后以1为起点,仅做一次dijkstra,就能得到1到所有点的最短距离,即反向前的,所有点到1点的最短距离。所以,本题的正解应为:先以1为起点,做一次dijkstra,算出,1到所有点的最短距离,然后将边反向,再以1为起点,做一次dijkstra,此时就能得到,其他所有点到1的最短距离,将所有的最短距离相加,即为答案。时间复杂度为$O(nlogn)$。

 #include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std; #define INF 0x3f3f3f3f
const int maxn =+; int n,m;
struct Edge{
int to;
int next;
int w;
}; Edge edge[maxn],redge[maxn]; struct NODE{
int index;
int dis;
bool operator < (NODE const &tmp)const{
return dis>tmp.dis;
}
}d[maxn]; int dist[maxn];
int cnt,rcnt,head1[maxn],head2[maxn],vis[maxn]; void init(){
memset(head1,-,sizeof(head1));
memset(head2,-,sizeof(head2));
cnt=,rcnt=;
} void add1(int u,int v,int w){
edge[cnt].to=v;edge[cnt].w=w;
edge[cnt].next=head1[u];
head1[u]=cnt++;
} void add2(int u,int v,int w){
redge[rcnt].to=v;redge[rcnt].w=w;
redge[rcnt].next=head2[u];
head2[u]=rcnt++;
} void dijkstra1(int st){
for(int i=;i<=n;i++){
vis[i]=;d[i].dis=INF,d[i].index=i;
} priority_queue<NODE>q;
d[st].dis=;q.push(d[st]);
while(!q.empty()){
int u=q.top().index;
q.pop();
if(vis[u])continue;
vis[u]=;
for(int i=head1[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(d[v].dis>d[u].dis+edge[i].w){
d[v].dis=d[u].dis+edge[i].w;
q.push(d[v]);
}
}
}
} void dijkstra2(int st){ //因为正、反向边的edge[],和head[]散组不同,所以要将另外再写一个dijkstra函数
for(int i=;i<=n;i++){
vis[i]=;d[i].dis=INF,d[i].index=i;
} priority_queue<NODE>q;
d[st].dis=;q.push(d[st]);
while(!q.empty()){
int u=q.top().index;
q.pop();
if(vis[u])continue;
vis[u]=;
for(int i=head2[u];i!=-;i=redge[i].next){
int v=redge[i].to;
if(d[v].dis>d[u].dis+redge[i].w){
d[v].dis=d[u].dis+redge[i].w;
q.push(d[v]);
}
}
}
} int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&m);
init();
for(int i=;i<=m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
add1(a,b,c); //存储该有向图正确的边
add2(b,a,c); //将该有向图的所有边反向存储
} long long sum=; dijkstra1(); //边未反向之前,求出1到所有点的最短路
for(int i=;i<=n;i++){
sum+=d[i].dis;
} dijkstra2(); //将边反向后,求出所有点到1点的最短路
for(int i=;i<=n;i++){
sum+=d[i].dis;
}
printf("%lld\n",sum);
}
return ;
}

2018-08-27

POJ-1511 Invitation Cards (单源最短路+逆向)的更多相关文章

  1. Invitation Cards POJ - 1511 (双向单源最短路)

    In the age of television, not many people attend theater performances. Antique Comedians of Malidine ...

  2. 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 / ...

  3. poj 1511 Invitation Cards (最短路)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 33435   Accepted: 111 ...

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

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

  5. poj 1511 Invitation Cards(最短路中等题)

    In the age of television, not many people attend theater performances. Antique Comedians of Malidine ...

  6. POJ 1511 Invitation Cards (最短路spfa)

    Invitation Cards 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/J Description In the age ...

  7. [POJ] 1511 Invitation Cards

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 18198   Accepted: 596 ...

  8. DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards

    题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...

  9. POJ 1511 Invitation Cards (spfa的邻接表)

    Invitation Cards Time Limit : 16000/8000ms (Java/Other)   Memory Limit : 524288/262144K (Java/Other) ...

  10. Poj 1511 Invitation Cards(spfa)

    Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...

随机推荐

  1. php 利用root 权限执行shell脚本

    http://blog.csdn.net/lxwxiao/article/details/8513355 也可以指定某个shell文件不需要密码 www-data ALL=(ALL) NOPASSWD ...

  2. composer设计原理与基本用法

    原文地址:http://blog.turn.tw/?p=1039 COMPOSER進階原理:PHP命名空間與PSR-0   http://blog.turn.tw/?p=1122 Moving PHP ...

  3. UML入门[转]

    访问权限控制 class Dummy { - private field1 # protected field2 ~ package method1() + public method2() } Al ...

  4. ROS学习笔记(一) # ROS参数服务器

    参考 roscpp/Overview/Parameter Server 0. 概述 ROS参数服务器能够保存 string, int, float, double, bool, list, dicti ...

  5. LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇

    题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...

  6. ES系列十、ES常用查询API

    1.term查询 { "query": { "term": { "title": "crime" } } } 1.1.指 ...

  7. dubbo系列五、dubbo核心配置

    一.配置文件 1.生产者配置provider.xml <?xml version="1.0" encoding="UTF-8"?> <bean ...

  8. 调用链系列二、Zipkin 和 Brave 实现(springmvc、RestTemplate)服务调用跟踪

    Brave介绍 1.Brave简介 Brave 是用来装备 Java 程序的类库,提供了面向标准Servlet.Spring MVC.Http Client.JAX RS.Jersey.Resteas ...

  9. 【转】Oracle 11g安装图文攻略

    一.Oracle 下载     注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 二.Oracle安装     1. ...

  10. PYTHON-绑定方法 反射 内置函数

    '''绑定方法类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 如何用: 绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰 ...