题目描述
给一个n(1≤n≤2500)个点m(1≤m≤6200)条边的无向图,求s到t的最短路。
输入格式
第一行四个由空格隔开的整数n、m、s、t。
之后的m行,每行三个正整数si、ti、wi(1≤wi≤1e9),表示一条从si 到ti长度为wi的边。
输出格式
一个整数表示从s到t的最短路长度。数据保证至少存在一条道路。
样例输入
7 11 5 4 2 4 2 1 4 3 7 2 2 3 4 3 5 7 5 7 3 3 6 1 1 6 3 4 2 4 3 5 6 3 7 2 1
样例输出
7
#include <bits/stdc++.h>
using namespace std;
int n,m,s,t;
typedef long long ll;
const int N =100001;
ll dist[N],inf=ll(1e18);
bool inque[N];
struct edge
{
int v;
int time;
};
struct youxian{
int index;
ll dist;
bool operator<(const youxian &tmp)
const {
return dist>tmp.dist;
}
};
vector<edge>e[N];
ll fun()
{
int i;
for(i=1;i<=n;i++)
{
dist[i]=inf;
inque[i]=false;
}
dist[s]=0;
priority_queue<youxian>Q;
Q.push({s,0});
while(!Q.empty()){
int u=Q.top().index;
Q.pop();
if(inque[u]) continue;
inque[u]=true;
int size=int (e[u].size());
for(i=0;i<size;i++){
int v=e[u][i].v,time=e[u][i].time;
if(dist[v]>dist[u]+time){
dist[v]=dist[u]+time;
Q.push({v,dist[v]});
}
}
}
return dist[t];
}
int main()
{
int u,v,w;
scanf("%d %d %d %d",&n,&m,&s,&t);
for(int i=0;i<m;i++){
scanf("%d %d %d",&u,&v,&w);
e[u].push_back({v,w});
e[v].push_back({u,w});
}
printf("%lld\n",fun());
return 0;
}
————————————————
版权声明:本文为优快云博主「)NCuyALnA$Ke」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/dy416524/article/details/86531056
PS:本题目的边为无向边,所以用邻接表加边时要成对加入.
用对组类型数据的二维vector容器来存放边数据是一个更好的方法