POJ 1511 Invitation Cards (ZOJ 2008) 使用优先队列的dijkstra
传送门:
http://poj.org/problem?id=1511
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1008
题目大意:
给定p个点,还有他们的边q,(有向图)求从结点1出发到所有结点和所有结点到1的最短路径之和。
其中1 <= P,Q <= 1000000
思路:
和上次 POJ 3268 Silver Cow Party 一样,有向图倒着建立就把从所有结点到1的最短路径改为了从1到所有,那么只需两次dijkstra即可。
还有就是数据量大,要用优先队列的dijkstra,堆优化的更好。
嗯,第一次写这个,参考了别人的。
code1:2014/1/1更新。。。
今天自己写的------
直接用数组模拟链表快了好多,zoj排名挺靠前面的,嘻嘻,不过poj又被虐。。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=1000000+10;
bool vis[MAXN];
int head[2][MAXN];
int n,m;
long long ans;
struct edge
{
int to;
int cost;
int next;
}e[2][MAXN]; struct node
{
int from;
int cost;
node(int f,int c){from=f;cost=c;}
bool operator < (const node& b)const
{
return cost > b.cost;
}
}; int len;
void insert(int from,int to,int cost)
{
e[0][len].to=to;
e[1][len].to=from; e[0][len].cost=e[1][len].cost=cost; e[0][len].next = head[0][ from ];
e[1][len].next = head[1][ to ]; head[0][from]=len;
head[1][to]=len; len++;
} void dijkstra(int kind)
{
memset(vis,0,sizeof(vis));
priority_queue<node> q;
q.push(node(1,0)); int num=0;
while(!q.empty())
{
node cur=q.top();
q.pop(); if(vis[cur.from]==true) continue; vis[cur.from]=true;
ans+=cur.cost;
num++; if(num==n)
break; //这里写得真纠结- -||| for(int ne=head[kind][cur.from];ne!=-1;ne=e[kind][ ne ].next)
{
if(!vis[e[kind][ ne ].to])
q.push(node(e[kind][ ne ].to,e[kind][ ne ].cost+cur.cost));
}
}
} int main()
{
int T;
scanf("%d",&T);
int from,to,cost;
while(T--)
{
len=0;
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&from,&to,&cost);
insert(from,to,cost);
}
ans=0;
dijkstra(0);
dijkstra(1);
printf("%lld\n",ans);
}
return 0;
}
code 2:
2013/12/31第一次写,基本上是模仿别人的
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=1000000+10;
long long ans;
bool vis[MAXN];
int n,m;
struct edge
{
int to,cost;
edge* next;
edge(){next=NULL;}
}*e[2][MAXN]; struct node
{
int cost,id;
bool operator < (const node& b) const
{
return cost>b.cost;
}
node(int i,int c){ cost =c;id=i;}
}; inline void addedge(int from,int to,int cost)
{
edge *p=new edge;
edge *q=new edge; p->next=e[0][from];
q->next=e[1][to]; p->to=to;
q->to=from; p->cost=q->cost=cost; e[0][from]=p;
e[1][to]=q;
} void dijkstra(int kind)
{
memset(vis,0,sizeof(vis));
priority_queue<node> q;
int num=0;
node cur(1,0);
q.push(cur);
while(!q.empty())
{
cur=q.top();
q.pop();
if(vis[cur.id]==true)
continue; vis[cur.id]=true;
ans+=cur.cost;
num++;
if(num==n)
break; for(edge *p=e[kind][cur.id];p!=NULL;p=p->next)
{
if(vis[p->to]==false)
{
node temp(p->to,p->cost+cur.cost);
q.push(temp);
}
}
} } int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(e,NULL,sizeof(e)); scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int from,to,cost;
scanf("%d%d%d",&from,&to,&cost);
addedge(from,to,cost);
}
ans=0;
dijkstra(0);
dijkstra(1);
printf("%lld\n",ans);
}
return 0;
}
POJ 1511 Invitation Cards (ZOJ 2008) 使用优先队列的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
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 18198 Accepted: 596 ...
- 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 : 16000/8000ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) ...
- POJ 1511 Invitation Cards (最短路spfa)
Invitation Cards 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/J Description In the age ...
- Poj 1511 Invitation Cards(spfa)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...
- (简单) POJ 1511 Invitation Cards,SPFA。
Description In the age of television, not many people attend theater performances. Antique Comedians ...
- POJ 1511 Invitation Cards 链式前向星+spfa+反向建边
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 27200 Accepted: 902 ...
随机推荐
- dp之多重背包(未用二进制优化)
hdu 2191: #include <iostream>#include <stdio.h>#include <string.h>using namespace ...
- Java数据传递实验
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在开发过程中,我们经常会遇到对象传递的问题,有时仅仅传递数据,有时却要实现数据同步:这时,就要分清两 ...
- xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...
- 洛谷 P3505 [POI2010]TEL-Teleportation
P3505 [POI2010]TEL-Teleportation 题目描述 King Byteasar is the ruler of the whole solar system that cont ...
- jQuery返回值:jQuery对象
$(function(){ //返回值 alert($); //jQuery //以下返回的全是jQuery对象 alert($()); alert($('#box')); alert($('#box ...
- [Node.js] Serve Static Files with Express
In this lesson we will find out how to serve static assets (images, css, stylesheets, etc.) with Exp ...
- 5lession-path路径相关操作
今天开始接触到了文件目录.路径方面的知识点.记录如下 先看代码 #!/usr/bin/python # -*- coding: utf-8 -*- import os import sys curre ...
- Bitmap-把方形图片处理为圆形
这个是直接在网上转载的,自己验证可靠 转载自http://my.oschina.net/zhouz/blog/213164 直接贴上代码 import android.graphics.Bitmap; ...
- js进阶 14-9 ajax事件有哪些
js进阶 14-9 ajax事件有哪些 一.总结 一句话总结:ajax开始时事件.发送时事件,请求完成时事件,请求成功时事件,请求结束时事件,请求错误时事件事件. 1.ajax事件的监听对象是谁? 都 ...
- Linux设备空间存储满问题
问题 linux创建文件夹文件.补全,启动服务均报错,具体报错信息如下 [root@localhost log]# mkdir /log/mysql -p mkdir: 无法创建目录"/lo ...