1 条题解
-
0GaryFang LV 4 @ 2018-11-09 08:10:36
#include<bits/stdc++.h>
#define MAXN 100010
#define MAXM 200010
using namespace std;
long long last[MAXN],to[MAXM],nex[MAXM],v[MAXM],cnt=0,dis[MAXN];
bool vis[MAXN];
long long n,m,s,t;
void add(int x,int y,int w)
{
nex[++cnt]=last[x];//上一条边的编号
to[cnt]=y;//此边到哪个点
v[cnt]=w;//权值
last[x]=cnt;//以x开头的最后一条边的编号
}
priority_queue< pair<int,int> > q;
void dijkstra(int s)
{
for(int i=1;i<=n;i++) dis[i]=2147483647;//其实这样也可以,因为会自己更新的
dis[s]=0;
q.push(make_pair(0,s));//放入初始节点
while(!q.empty())//还未遍历完
{
int x=q.top().second;//堆头节点,最小节点编号
q.pop();//用过弹出
if(vis[x]) continue;//已拓展的就不要再做了
vis[x]=1;
for(int i=last[x];i;i=nex[i])//拓展
{
int y=to[i];//下一个点
if(dis[y]>dis[x]+v[i])
{
dis[y]=dis[x]+v[i];
q.push(make_pair(-dis[y],y));//用相反数实现小根堆,放入堆
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);//单向边
}
cin>>s>>t;
dijkstra(s);
if (dis[t]!=2147483647) cout<<dis[t]<<endl;else cout<<-1<<endl;
return 0;
}
- 1