题意
给一个无向图,让我们找到一个从 s 到 e 的一条单源最短路。
代码
# include <bits/stdc++.h>
using namespace std;
# define db double
# define ll long long
# define Pir pair< int , int >
# define fi first
# define se second
# define pb push_back
# define m_p make_pair
# define inf 0x3f3f3f3f
# define INF 0x3f3f3f3f3f3f3f3f
const int N = 2550 , M = 6205 * 2 ;
int n, m, s, t;
struct Edge
{
int v, w, ne;
} e[ M] ;
int h[ N] , tot;
void add ( int u, int v, int w)
{
e[ ++ tot] = Edge{ v, w, h[ u] } ; h[ u] = tot;
}
int dis[ N] , vis[ N] ;
int dijkstra ( )
{
priority_queue< Pir, vector< Pir> , greater< Pir>> q;
memset ( dis, inf, sizeof dis) ;
dis[ s] = 0 ;
q. push ( { 0 , s } ) ;
while ( q. size ( ) )
{
int u = q. top ( ) . se; q. pop ( ) ;
if ( u == t) return dis[ t] ;
if ( vis[ u] ) continue ;
vis[ u] = 1 ;
for ( int i = h[ u] ; i; i = e[ i] . ne) {
int v = e[ i] . v, w = e[ i] . w;
if ( dis[ v] > dis[ u] + w)
{
dis[ v] = dis[ u] + w;
q. push ( { dis[ v] , v } ) ;
}
}
}
return dis[ t] ;
}
int main ( )
{
scanf ( "%d %d %d %d" , & n, & m, & s, & t) ;
int u, v, w;
for ( int i = 0 ; i < m; i ++ ) {
scanf ( "%d %d %d" , & u, & v, & w) ;
add ( u, v, w) ;
add ( v, u, w) ;
}
printf ( "%d\n" , dijkstra ( ) ) ;
return 0 ;
}