poj 1511 邻接表+堆优化的dijstra
来源:互联网 发布:一元微信提现赚钱软件 编辑:程序博客网 时间:2024/05/21 17:33
这题最终的意思很简单,输入图,求出从源点到所有点的最短路,再把这个图的所有边反向,再求一次源点到所有点的最短路。
这个和poj另一道题很相似,合适这题 的意义在于数据。
你这个图是无法用邻接矩阵存下的,因为邻接矩阵太大了,你只能用邻接表。
那么这个题就是用邻接表的用优先队列优化过的dijstra过的了。
(其实堆优化就是用优先队列而已,不和那些人装样子……)
注意这个图的所有边反向是怎么实现的。
AC代码:
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <queue>using namespace std;const int maxe=1e6+10;const int maxv=1e6+10;const int inf=0x3f3f3f3f;typedef long long ll;int N,M;int restore[maxe][3];int which=1;int head[maxv];struct EDGE{ int d,w,next; EDGE():next(-1){}}e[maxv];void add(int s, int d,int w){ e[which].d=d; e[which].w=w; e[which].next=head[s]; head[s]=which++;}void initforgraph(){ memset(head,-1,sizeof(head)); memset(e,0,sizeof(e));}struct pnwdis{ int pn,dist; friend bool operator<(pnwdis a,pnwdis b) { return a.dist>b.dist; }};int dis[maxv];void dijstra(int st){ bool settled[maxv]; priority_queue<pnwdis> Q; memset(settled,0,sizeof(settled)); while(!Q.empty()) Q.pop(); for(int i=1;i<=N;i++) dis[i]=inf; dis[st]=0; pnwdis stt; stt.pn=st; stt.dist=0; Q.push(stt); while(!Q.empty()) { pnwdis t=Q.top(); Q.pop(); if(settled[t.pn]) continue; settled[t.pn]=1; for(int i=head[t.pn];i!=-1;i=e[i].next) { int to=e[i].d; int mid=t.pn; if(!settled[to]) { if(dis[to]>dis[mid]+e[i].w) { dis[to]=dis[mid]+e[i].w; pnwdis tt; tt.pn=to; tt.dist=dis[to]; Q.push(tt); } } } }}void print(){ for(int i=1;i<=N;i++) { printf("%d ",dis[i]); } printf("\n");}int main(){ int T; scanf("%d",&T); while(T--) { ll ans=0; scanf("%d%d",&N,&M); which=1; initforgraph(); int t1,t2,t3; for(int i=1;i<=M;i++) { scanf("%d%d%d",&t1,&t2,&t3); restore[i][0]=t1; restore[i][1]=t2; restore[i][2]=t3; add(t1,t2,t3); } dijstra(1); for(int i=1;i<=N;i++) ans+=dis[i]; initforgraph(); which=1; for(int i=1;i<=M;i++) { add(restore[i][1],restore[i][0],restore[i][2]); } dijstra(1); for(int i=1;i<=N;i++) ans+=dis[i]; cout<<ans<<endl; }}代码有点长……不好意思水平有限……
阅读全文
0 0
- poj 1511 邻接表+堆优化的dijstra
- dijstra邻接表+堆优化模板
- 堆优化 Dijstra单源最短路径算法 2(邻接表)
- Dijstra邻接表法
- 最短路dijstra 堆优化
- 堆优化的dijkstra算法(以邻接表存储)
- 欢乐派对 堆优化+邻接表
- Dijkstra算法--邻接表存储+堆优化
- poj 3275 邻接表优化Floyd
- 有向图中Dijstra最短路径算法的邻接表实现
- 基于邻接表的有回溯最小堆优化的单源最短路Dijkstra算法
- POJ 1511 邻接表+spfa
- poj 1511(SPFA+邻接表)
- codeforces 20C 只能用dijstra堆优化或者spfa
- poj 1511 Invitation Cards 静态邻接表的SPFA
- POJ 1511 (dijkstra+heap+带指针的邻接表)
- Dual Core CPU POJ 3469(邻接表+GAP+CUR优化)
- Dual Core CPU POJ 3469(邻接表+GAP+CUR优化)
- 唯密文攻击--实验吧详细解
- UVA-442 Matrix Chain Multiplication
- 读几本c++书的记录
- python3 range 倒序
- Markdown 11种基本语法
- poj 1511 邻接表+堆优化的dijstra
- 了解回调函数的一些总结
- HDU
- Hibernate学习之---继承映射
- 一维数组的定义和一维数组的引用
- Java学习之Iterator(迭代器)的一般用法
- [模板]归并排序
- C# webservice HttpContext.Current.Response.End() 引发线程中断的处理
- 数组和指针的比较