题目链接: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. Round 403 div. 2

    B 可以二分相遇的坐标:也可以二分时间,判断是否存在两个人的区间没有交. An easy way to intersect a number of segments [l1, r1], ..., [l ...

  2. MapReduce(一) mapreduce基础入门

    一.mapreduce入门 1.什么是mapreduce 首先让我们来重温一下 hadoop 的四大组件:HDFS:分布式存储系统MapReduce:分布式计算系统YARN: hadoop 的资源调度 ...

  3. python并行编程学习之绪论

    计算机科学的研究,不仅应该涵盖计算处理所基于的原理,还因该反映这些领域目前的知识状态.当今,计算机技术要求来自计算机科学所有分支的专业人员理解计算机处理的基础的关键,在于知道软件和硬件在所有层面上的交 ...

  4. Ubuntu+NDK编译openssl

    为了Android上使用libcurl且支持HTTPS协议,需要依赖openssl,因此先来了解一下如何编译OpenSSL1.编译ARM下的共享库(默认的)我使用的是guardianproject的o ...

  5. 怎样在hibernate的HQL语句中使用mysql 的自定义函数?

    问题:怎样在hibernate中使用mysql的函数? 1.hibernate支持原生态的sql语句查询,使用session.createSQLQuery()创建查询对象: 2.怎样在hql中使用my ...

  6. js绑定事件和解绑事件

    在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法  只支持IE678,不兼容其他浏览器 addEv ...

  7. CF767 A. Snacktower 暴力

    LINK 题意:给出一个序列,如果存的数满足连续递减(第一个必须为n)则输出否则输出空行,并暂存当前数 思路:直接暴力不可行,由于待输出的数的个数满足单调性可以稍微优化,即从上一回输出的最小一个数开始 ...

  8. Python学习笔记(三十二)常用内建模块(1)— datetime

    >>> from datetime import datetime >>> now = datetime.now() # 获取当前datetime >> ...

  9. 「七天自制PHP框架」第一天:路由与控制器

    我们为什么要使用路由? 原因1:一个更漂亮的URI 1.URI的改进 刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数.这样的URI有两个缺点,一是容易被 ...

  10. jQuery经典面试题及答案精选[转]

    这两天有个面试,把这些记在这里. 问题:jQuery的美元符号$有什么作用? 回答:其实美元符号$只是”jQuery”的别名,它是jQuery的选择器,如下代码: $(document).ready( ...