Dijstra
来源:互联网 发布:linux vim命令模式 编辑:程序博客网 时间:2024/06/11 13:57
优先队列版本
#include<cstdio>#include<cstring>#include<queue>#include<vector>#include<algorithm>using namespace std;int n,m,fir[100001],dis[100001],now,loc[100001],g[100001];struct node{ int w,t,nxt;}l[6000001];bool cmp(const pair<int,int>a,const pair<int,int>b){ return a.first<b.first;//}priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > >q;pair<int,int>Now;int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&now,&l[i].t,&l[i].w); l[i].nxt=fir[now]; fir[now]=i; l[m+i].w=l[i].w,l[m+i].t=now; l[m+i].nxt=fir[l[i].t];fir[l[i].t]=m+i; } memset(dis,127,sizeof dis);dis[1]=0; q.push(make_pair(0,1)); for(int i=2;i<=n;i++){ loc[i]=i; q.push(make_pair(1<<30,i)); } for(int i=1;i<=n;i++){ while(g[q.top().second]) q.pop(); g[q.top().second]=1; Now=q.top(); for(int j=fir[Now.second];j;j=l[j].nxt) if(dis[l[j].t]>Now.first+l[j].w){ dis[l[j].t]=Now.first+l[j].w; q.push(make_pair(dis[l[j].t],l[j].t)); } q.pop(); } printf("%d",dis[n]);}
堆优化版本(更快)
#include<cstdio>#include<algorithm>#include<cstring>#include<cctype>#define maxn 100005using namespace std;int n,m,dis[maxn],s,t;bool vis[maxn],in[maxn];int heap[maxn],pos[maxn],size;struct node{ int to,cst,nxt;}e[6000005];int cnt_e,fir[100005];void get(int &res){ res=0; char ch; while(!isdigit(ch=getchar())); for(res=ch-'0';isdigit(ch=getchar());res=res*10+ch-'0');}void Node(int u,int v,int cst){ e[++cnt_e].nxt=fir[u]; e[cnt_e].to=v; e[cnt_e].cst=cst; fir[u]=cnt_e;}void swap(int a,int b){ heap[a]^=heap[b],heap[b]^=heap[a],heap[a]^=heap[b]; pos[heap[a]]=a; pos[heap[b]]=b;}void shift(int now){ while(now>1){ if(dis[heap[now]]<dis[heap[now>>1]]){ swap(now,now>>1); now>>=1; } else return; }}void put(int id){ heap[++size]=id; pos[id]=size; shift(size);}int get(){ int tmp=heap[1],now=1,nxt; heap[1]=heap[size--],pos[heap[1]]=1; while(now<<1<=size){ nxt=now<<1; if(nxt+1<=size && dis[heap[nxt]]>dis[heap[nxt+1]]) nxt++; if(dis[heap[nxt]]>dis[heap[now]]) return tmp; swap(now,nxt); now=nxt; } return tmp;}int main(){ int u,v,w; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { get(u);get(v);get(w); Node(u,v,w); Node(v,u,w); } int Maxloc; memset(dis,127/3,sizeof dis); dis[1]=0; for(int i=1;i<=n;i++) put(i); for(int i=1;i<n;i++){ Maxloc=get(); for(int j=fir[Maxloc];j;j=e[j].nxt) if(dis[e[j].to]>dis[Maxloc]+e[j].cst){ dis[e[j].to]=dis[Maxloc]+e[j].cst; shift(pos[e[j].to]); } } printf("%d",dis[n]);}
阅读全文
0 0
- Dijstra
- dijstra
- Dijstra
- Dijstra算法
- Dijstra算法
- dijstra算法
- dijstra算法
- hiho dijstra
- Dijstra算法
- 图---Dijstra
- Dijstra算法
- dijstra 模板
- dijstra算法
- dijstra算法学习
- Dijstra算法学习
- Dijstra邻接表法
- poj1797(dijstra)
- poj2253(dijstra应用)
- 准确Fragment
- Docker中容器的备份、恢复和迁移
- android-serialport-api源码(c代码部分)
- Fragment和ViewPager的替换关联
- 深圳房价教给我的三堂课
- Dijstra
- python 基础(三)一些要点回顾和字典 (和一些重点)
- Andriodjie——简单的购物车全选反选
- modelsim新建工程进行功能仿真
- 关于Unity渲染优化,你可能遇到这些问题
- mfc socket发送和接收数据和文件
- 训练GAN网络的技巧
- 计蒜客 课程规划(景驰无人驾驶1024编程邀请赛 D)
- 一分钟ECS上搭建云HBase Thriftserver