题目链接: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. 【POJ2891】Strange Way to Express Integers(拓展CRT)

    [POJ2891]Strange Way to Express Integers(拓展CRT) 题面 Vjudge 板子题. 题解 拓展\(CRT\)模板题. #include<iostream ...

  2. 【CF484E】Sign on Fence(主席树)

    [CF484E]Sign on Fence(主席树) 题面 懒得贴CF了,你们自己都找得到 洛谷 题解 这不就是[TJOI&HEOI 排序]那题的套路吗... 二分一个答案,把大于答案的都变成 ...

  3. Hive(一)基础知识

    一.Hive的基本概念 (安装的是Apache hive 1.2.1) 1.hive简介 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表, 并提供类 SQ ...

  4. 【learning】矩阵树定理

    问题描述 给你一个图(有向无向都ok),求这个图的生成树个数 一些概念 度数矩阵:\(a[i][i]=degree[i]\),其他等于\(0\) 入度矩阵:\(a[i][i]=in\_degree[i ...

  5. windows环境libevent搭建和demo分析

    libevent框架之前有做过分析,这次是谈谈如何将libevent搭建在vs工作环境下, 并且编写一个demo进行测试.测试过程中会再一次带大家分析消息是怎么传递 的. 我的libevent版本li ...

  6. ls乱码问题解决

    http://note.youdao.com/noteshare?id=c7ff510525b4dadaabb6f6a0a72040cc

  7. array_unique后,数组本身的值并不会变

    <?php $arr = [ ' ]; print_r($arr); print_r(array_unique($arr)); print_r($arr); //array_unique后,数组 ...

  8. 「HTML5」url、href、src区别

    一.URL的概念 统一资源定位符(或称统一资源定位器/定位地址.URL地址等,英语:Uniform Resource Locator,常缩写为URL),有时也被俗称为网页地址(网址).如同在网络上的门 ...

  9. windows7中用vitualbox安装OS X 10.11 El Capitan 及 Xcode 7.0--转载

    在 Win 7或8 下使用 VirtualBOX 虚拟机安装 OS X 10.11 El Capitan 及 Xcode 7.0 来源:http://bbs.feng.com/read-htm-tid ...

  10. centos7 mysql5.7.17源码安装

    **安装前准备 操作系统环境:Centos 7.2 1.解决依赖包并下载源码包至/home/soft/目录下 1 2 3 4 5 6 7 [root@node03 ~]# yum -y install ...