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 ...
随机推荐
- 上市公司恋上互联网金融 目前已有14家涌入P2P
时至今日,互联网金融已蔚然成风,诸多上市公司正前赴后继介入到P2P业务中,据记者初步统计,目前至少有14家A股上市公司参与了P2P业务.央行6月份的报告显示,中国当前有600多家P2P公司,交易额达到 ...
- ssh-keygen && ssh-copy-id 生成管理传输秘钥
- 洛谷 P2360 地下城主
P2360 地下城主 题目描述 你参加了一项秘密任务,在任务过程中你被困在了一个3D的地下监狱里面,任务是计时的,你现在需要在最短的时间里面从地牢里面逃出来继续你的任务.地牢由若干层组成,每一层的形状 ...
- 洛谷 P1358 扑克牌
P1358 扑克牌 题目描述 组合数学是数学的重要组成部分,是一门研究离散对象的科学,它主要研究满足一定条件的组态(也称组合模型)的存在.计数以及构造等方面的问题.组合数学的主要内容有组合计数.组合设 ...
- Oracle 11gR2光钎链路切换crs服务发生crash
Oracle 11gR2光钎链路切换crs服务发生crash 背景: 我们将Oracle 11gR2(11.2.0.4)在RedHat EnterPrise 5.8上通过RDAC完毕的多路径链路冗余. ...
- C语言之文件操作06——写数据到文本文件遇0停止
//文件 /* =============================================================== 题目:输入10个篮球运动员的身高数据(cm)保存至D盘文 ...
- IPv6地址表示方法详解
IPv6是互联网协议的第六版:最初它在IETF的 IPng选取过程中胜出时称为互联网新一代网际协议(IPng),IPv6是被正式广泛使用的第二版互联网协议. 现有标准IPv4只支持大概40亿(4×10 ...
- 10lession-if-else条件语句
python的条件选择语句跟其他语言的及其相似,这里就不做详细记录,仅仅是看个例子好了 #!/usr/bin/python "]: print('1 in [1,2,3,"4&qu ...
- 内存泄漏与指针悬挂&野指针介绍
内存泄漏概念:内存泄漏时指动态申请的内存空间没有正常释放,但是也不能继续使用的情况. 例如: char *ch1; ch1 = new char('A'); char = *ch2 = new cha ...
- 36.Node.js 工具模块--OS模块系统操作
转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js os 模块提供了一些基本的系统操作函数.我们可以通过以下方式引入该模 ...