Dijkstra
Dijkstra
题目大意:
给一个图,求出点1到点n的最短路径。
思路:
用距离点1最近的点去更新其他点距离点1的最短路径。
bool vis[N] ;
ll n , m , u , v , w ;
ll ds[N] ;
vector<pll> eg[N] ;
ll dij(){
priority_queue<pll , vector<pll> , greater<pll> > hp ;
hp.push({0 , 1}) ;
while(hp.size()){
auto hd = hp.top() ; hp.pop() ;//拿出和点1最近的点
ll idx = hd.y , dis = hd.x ;
if(vis[idx]) continue ;
vis[idx] = 1 ;//用该点更新和该点相连的点的最短路径
for(auto i : eg[idx]){//从1直接到i和从1到idx再到i
if(ds[i.y] > ds[idx] + i.x){
ds[i.y] = ds[idx] + i.x ;
hp.push({ds[i.y] , i.y}) ;
}
}
}
return ds[n] == INF ? -1 : ds[n] ;
}
void solve(){
cin >> n >> m ;
for(int i = 2 ; i <= n ; i ++ ) ds[i] = INF ;///
for(int i = 1 ; i <= m ; i ++ ){
cin >> u >> v >> w ;
eg[u].push_back({w , v}) ;
}
cout << dij() ;
}

浙公网安备 33010602011771号