POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))
题目链接: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(邻接表优化))的更多相关文章
- POJ 1511 - Invitation Cards (dijkstra优先队列)
题目链接:http://poj.org/problem?id=1511 就是求从起点到其他点的最短距离加上其他点到起点的最短距离的和 , 注意路是单向的. 因为点和边很多, 所以用dijkstra优先 ...
- 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 / ...
- POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 16178 Accepted: 526 ...
- POJ 1511 Invitation Cards (spfa的邻接表)
Invitation Cards Time Limit : 16000/8000ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) ...
- POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...
- DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards
题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...
- Poj 1511 Invitation Cards(spfa)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...
- SPFA算法(2) POJ 1511 Invitation Cards
原题: Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 31230 Accepted: ...
- poj 1511 Invitation Cards spfa 邻接矩阵
题目链接: http://poj.org/problem?id=1511 题目大意: 这道题目比较难理解,我读了好长时间,最后还是在队友的帮助下理解了题意,大意就是,以一为起点,求从一到其他各点的最短 ...
随机推荐
- Redis存储系统
一.QuickStart 1.Redis简介: redis是一个性能非常优秀的内存数据库,通过key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string ...
- 【DP】【CF855C】 Helga Hufflepuff's Cup
Description 给你一个树,可以染 \(m\) 个颜色,定义一个特殊颜色 \(k\) , 要求保证整棵树上特殊颜色的个数不超过 \(x\) 个.同时,如果一个节点是特殊颜色,那么它的相邻节点的 ...
- 在 Ubuntu16.04上安装anaconda+Spyder+TensorFlow(支持GPU)
TensorFlow 官方文档中文版 http://www.tensorfly.cn/tfdoc/get_started/introduction.html https://zhyack.github ...
- Highcharts.js -纯javasctipt图表库初体验
一.highcharts简介以及引入 highcharts作为免费提供给个人学习.个人网站和非商业用途使用的前端图表演示插件的确使用起来十分方便和轻便.在我最近完成一个需求的时候用到了它, 它的兼容性 ...
- 巧用Java中Calendar工具类
Java的JDK中提供了一系列好用的util工具类.Calendar就是java.util中用于处理日期的工具类.且该工具类易学易用实用. 工具类Calendar是抽象类. PS:为什么把Calend ...
- Error : getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
环境 阿里云 centos7 node v8.11.3 npm 5.6.0 错误 npm update 解决 ping registry.npmjs.org 发现https://registry.np ...
- MongoDB - MongoDB CRUD Operations, Insert Documents
MongoDB provides the following methods for inserting documents into a collection: db.collection.inse ...
- [ERROR] Too many connections 尚未解决
[ERROR] - com.alibaba.druid.support.logging.Log4j2Impl.error(Log4j2Impl.java:53) - create connection ...
- 【BZOJ4552】【HEOI2016】排序 [二分答案][线段树]
排序 Time Limit: 60 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在2016年,佳媛姐姐喜欢上了数字序列 ...
- 【Codeforces752D】Santa Claus and a Palindrome [STL]
Santa Claus and a Palindrome Time Limit: 20 Sec Memory Limit: 512 MB Description 有k个串,串长都是n,每个串有一个a ...