dijkstra (模板)
2024-09-03 15:50:10
突然意识到以前写的都是假的dij,感谢GhostCai神犇。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define int long long using namespace std;
const int MAXN = ;
const int MAXM = ;
const int inf = ; inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
} int n,m,S,dis[MAXN],head[MAXN],cnt;
int to[MAXM],nxt[MAXM],val[MAXM];
bool vis[MAXN]; struct Node{
int id,w;
friend bool operator<(const Node A,const Node B){
return A.w>B.w;
}
}; inline void add(int bg,int ed,int w){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt,val[cnt]=w;
} priority_queue<Node> Q; void dijkstra(){
for(int i=;i<=n;i++) dis[i]=inf;
Node now;now.id=S;now.w=;dis[S]=;
int p,ww;Q.push(now);
while(!Q.empty()){
Node x=Q.top();Q.pop();p=x.id;ww=x.w;
if(vis[p] || dis[p]!=ww) continue;
vis[p]=;int u;
for(register int i=head[p];i;i=nxt[i]){
u=to[i];
if(dis[p]+val[i]<dis[u]) {
dis[u]=dis[p]+val[i];
now.id=u;now.w=dis[u];
Q.push(now);
}
}
}
} signed main(){
n=rd(),m=rd(),S=rd();int x,y,z;
for(int i=;i<=m;i++){
x=rd(),y=rd(),z=rd();
add(x,y,z);
}
dijkstra();
for(int i=;i<=n;i++) printf("%lld ",dis[i]);
return ;
}
最新文章
- Android中如何查看内存
- js⑥
- 关于flume中的几个疑惑
- 多路由器环境下路由器的入口IP地址及DHCP设置探讨
- yii学习小结
- ls -l命令详解
- mysql 数据库查询与实例。
- Android学习总结——文件储存
- 【计算几何初步-凸包-Jarvis步进法。】【HDU1392】Surround the Trees
- 【STL】关联容器 — hash_set
- python如何玩“跳一跳”!(windows安桌版本请进!)
- odoo开发笔记 -- 翻译机制及导入.po文件
- MySQL 术语
- MetaMask安装使用指南
- Android Sensor——传感器
- AJAX简单介绍
- webDAV服务的开启以及客户端的上传、下载、删除、新建文件夾、列表的代码(C#)
- docker使用现有容器生成新的镜像
- OO设计基本原则
- (转) sync命令