Dijkstra的优先队列
2024-10-07 16:32:37
模板
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<queue>
using namespace std;
#define inf 2147483647
typedef long long ll;
const ll mod=1e9+;
const int maxn=+;
ll dis[maxn];
struct edg{
int to;
int w;
};
vector<edg > sm[maxn];
typedef pair<int ,int > P;//最短距离,标点
void dij(int v){
fill(dis,dis+maxn,-);
priority_queue<P,vector<P>,greater<P> > que;
que.push(P(,v));
P tem;
dis[v]=;
while(!que.empty()){
tem=que.top();
que.pop();
int i=tem.second;
if(tem.first>dis[i])
continue;
for(int j=;j<sm[i].size();j++){
edg e=sm[i][j];
if(dis[e.to]==-||dis[e.to]>dis[i]+e.w){
dis[e.to]=dis[i]+e.w;
que.push(P(dis[e.to],e.to));
}
}
}
}
int main(){
int n,m,s,t;
int u,v;
ll w;
ll ans=;
edg tem;
cin>>n>>m>>s>>t;
for(int i=;i<m;i++){
cin>>u>>v>>w;
w=log(w)/log();
tem.to=v;
tem.w=w;
sm[u].push_back(tem);
}
dij(s);
if(dis[t]==-){
cout<<"-1"<<endl;
}
else{
//cout<<dis[t]<<endl;
ll tem=;
while(dis[t]!=){
if(dis[t]%==){
ans=(ans*tem)%mod;
}
dis[t]/=;
tem=(tem*tem)%mod;
}
cout<<ans<<endl;
}
return ;
}
最新文章
- HTML之Hello World
- Swift建立栈的泛型结构体以及top()、push()、pop()定义函数的定义
- javascript变量问题
- 2014第五届蓝桥杯试题C/C++程序设计B组——切面条
- C#模拟键盘鼠标事件 SendKeys 的特殊键代码表(转)
- Scanner scanner=new Scanner(System.in)
- mcstructs-MircoCStructs用C语言实现的微型数据结构库
- 3.Node.js 自定义微信菜单
- eclipse中删除多余的tomcat server
- 20170723-Ioc与AOP
- CSS速查列表-1-(background)背景
- POJ-3259 Wormholes---SPFA判断有无负环
- LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]
- COMCMS_CORE 起步篇,如何运行和部署
- https证书概念
- http协议下载文件
- asio的网络通讯代码练手
- MariaDB学习记录
- PostgreSQL 常用的命令
- 【JavaScript】20款漂亮的css字体