题目链接:http://poj.org/problem?id=1511

题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9。问你从起点到各个点以及从各个点到起点的最小路程总和。

解题思路:这里用了优先队列优化的dijkstra复杂度mlogn,从起点到个点最短路径直接算就好了,算各个点到起点的最短路径,只要把边的方向反一下,再算一次从起点到个点最短路径就好了。

Dijkstra:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<functional>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;
typedef pair<int,int> p;
const int N=1e6+;
const int INF=<<;//这里不能比1e9小
struct edge{
int to,cost;
}; vector<edge>eg[N];
int V,E;
bool used[N];
int d[N];
int a[N],b[N],c[N]; void dijkstra(int s){
for(int i=;i<=V;i++){
d[i]=INF;
used[i]=false;
}
d[s]=; priority_queue<p,vector<p>,greater<p> >q;
q.push(p(,s));
while(!q.empty()){
p p1=q.top();
q.pop();
int v=p1.second;
if(used[v]) continue;
used[v]=true;
for(int i=;i<eg[v].size();i++){
edge e=eg[v][i];
if(d[e.to]>d[v]+e.cost){
d[e.to]=d[v]+e.cost;
q.push(p(d[e.to],e.to));
}
}
}
} int main(){
int q;
scanf("%d",&q);
while(q--){
scanf("%d %d",&V,&E);
for(int i=;i<=V;i++){
eg[i].clear();
}
for(int i=;i<=E;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
edge gg;
gg.to=b[i],gg.cost=c[i];
eg[a[i]].push_back(gg);
}
dijkstra();
LL sum=;
for(int i=;i<=V;i++){
sum+=d[i];
}
//将边的方向反一下
for(int i=;i<=V;i++){
eg[i].clear();
}
for(int i=;i<=E;i++){
edge gg;
gg.to=a[i],gg.cost=c[i];
eg[b[i]].push_back(gg);
}
dijkstra();
for(int i=;i<=V;i++){
sum+=d[i];
}
printf("%lld\n",sum);
}
}

SPFA:

 #include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int INF=<<;
const int N=1e6+; struct edge{
int to,cost;
}; vector<edge>eg[N];
int V,E;
bool used[N];//是否在队列中
int d[N];
int a[N],b[N],c[N]; void spfa(int s){
for(int i=;i<=V;i++){
d[i]=INF;
used[i]=false;
}
d[s]=; queue<int>q;
q.push(s);
used[s]=true;
while(!q.empty()){
int v=q.front();
q.pop();
used[v]=false;
for(int i=;i<eg[v].size();i++){
edge e=eg[v][i];
if(d[e.to]>d[v]+e.cost){
d[e.to]=d[v]+e.cost;
if(!used[e.to]){
used[e.to]=true;
q.push(e.to);
}
}
}
}
} int main(){
int q;
scanf("%d",&q);
while(q--){
scanf("%d%d",&V,&E);
for(int i=;i<=V;i++){
eg[i].clear();
}
for(int i=;i<=E;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
edge gg;
gg.to=b[i],gg.cost=c[i];
eg[a[i]].push_back(gg);
}
spfa();
long long sum=;
for(int i=;i<=V;i++){
sum+=d[i];
}
//方向反一下
for(int i=;i<=V;i++){
eg[i].clear();
}
for(int i=;i<=E;i++){
edge gg;
gg.to=a[i],gg.cost=c[i];
eg[b[i]].push_back(gg);
}
spfa();
for(int i=;i<=V;i++){
sum+=d[i];
}
printf("%lld\n",sum);
}
}

POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))的更多相关文章

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

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

  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(单源最短路,优先队列优化的Dijkstra)

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

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

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

  5. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

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

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

  7. Poj 1511 Invitation Cards(spfa)

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

  8. SPFA算法(2) POJ 1511 Invitation Cards

    原题: Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 31230   Accepted: ...

  9. poj 1511 Invitation Cards spfa 邻接矩阵

    题目链接: http://poj.org/problem?id=1511 题目大意: 这道题目比较难理解,我读了好长时间,最后还是在队友的帮助下理解了题意,大意就是,以一为起点,求从一到其他各点的最短 ...

随机推荐

  1. 纪念一个日子QAQ

    嗯事情是这样的 今天早上考试的时候不知道为什么特别累,精神并不是很好,T1半平面交裸题  T2当时没有仔细看题,T3想了一段时间后会正解(9:30),但是好像很难写的样子啊.. 但是似乎由于模拟考并不 ...

  2. NOI2014魔法森林题解报告

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,-,n,边标号为 1,2,3,-, ...

  3. Sqli-labs之sql注入基础知识

    (1)注入的分类 基于从服务器接收到的响应  ▲基于错误的SQL注入 ▲联合查询的类型 ▲堆查询注射 ▲SQL盲注 •基于布尔SQL盲注 •基于时间的SQL盲注 •基于报错的SQL盲注 基于如何处理输 ...

  4. Linux内核分析8

    周子轩 原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用gdb ...

  5. golang字符串常用函数

    package utils import "fmt" import "strconv" import "strings" var str s ...

  6. 虚拟机安装ubuntu14.04.5系统

    参考教程 在vitualbox安装 ubuntu14.04.2 LTS教程 http://jingyan.baidu.com/article/46650658228345f549e5f8cc.html ...

  7. thinkphp 3.2 部分数据库连贯操作phpstorm helper 文件

    <?php class Helper { /** * 用于设置数据写入和查询是否严格检查是否存在字段. * 默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常 * 如: * str ...

  8. My97DatePicker 报错 My97DP is not defined

    https://blog.csdn.net/BoomLee/article/details/80967926

  9. Web应用程序完全测试指南

    随着Web技术和移动互联网的发展,越来越多的应用被迁移到了云端,这也使得用户可以随时随地使用它们.目前大量的优质应用,逐渐提升了用户的品味,也降低了用户的容忍度,如果你的Web应用无法使用户满意,那么 ...

  10. 2017ACM暑期多校联合训练 - Team 2 1008 HDU 6052 To my boyfriend (数学 模拟)

    题目链接 Problem Description Dear Liao I never forget the moment I met with you. You carefully asked me: ...