【模板】迪杰斯特拉
来源:互联网 发布:java项目发布到服务器 编辑:程序博客网 时间:2024/06/04 00:26
模拟过程
//基于1557
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int maxn=100000+10;int first[maxn<<1],nxt[maxn<<1],tot;int dis[maxn];int n,m,s,e;bool done[maxn];struct edge { int f,t,v;}l[maxn<<1];void build(int f,int t,int v) { l[++tot]=(edge){f,t,v}; nxt[tot]=first[f]; first[f]=tot; return;}struct node{ int u,v; /*bool operator < (const node & b)const { return v>b.v; }*/};//分号必不可少 bool operator < (node a,node b){ return a.v > b.v;}//stl里大根堆用<处理,重载运算符时反过来处理就可以了priority_queue<node>q;//**< >里是node!**void init(){ tot=0; memset(first,0xfff,sizeof(first));}void dij(int s,int e) { memset(dis,0x3f3f3f3f,sizeof(dis)); memset(done,0,sizeof(done)); while(!q.empty()) q.pop();//可有可无的清空 q.push((node){s,0});//把node里的u和v都放到堆里,备用 dis[s] = 0;// while(!q.empty()) { node us=q.top();//将最短路的值最小的点作为中间点 q.pop(); int u=us.u;//中间点 if(done[u]) continue;//以u点为中间点的所有出点的最短路已经确定 done[u]=1; for(int i=first[u];i!=-1;i=nxt[i]) { int w=l[i].t; if(dis[w]>dis[u]+l[i].v) { dis[w]=dis[u]+l[i].v; q.push((node){w,dis[w]});//勿漏 } } }}int main(){ init(); int a,b,c; scanf("%d%d%d%d",&n,&m,&s,&e); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); build(a,b,c); build(b,a,c); } dij(s,e); cout<<dis[e]<<endl; return 0;}
阅读全文
0 0
- 迪杰斯特拉 模板
- 迪杰斯特拉模板
- 【模板】迪杰斯特拉
- 迪杰斯特拉算法_模板
- 迪杰斯特拉算法模板
- 模板
- 模板?
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- WebService实践(二)
- java double类型保留两位小数
- 网页用户登录权限校验的两种实现方式
- Java异常处理
- Python学习之惰性求值
- 【模板】迪杰斯特拉
- kaldi-ctc的安装、编译、测试
- B. Preparing for Merge Sort
- 欢迎使用CSDN-markdown编辑器
- C++错误之严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 'strcpy':
- IRGAN:大一统信息检索模型的博弈竞争
- 对象池模式
- java值传递
- 【UML】关系之关联关系