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() ;
} 
 
posted @ 2022-02-08 11:40  tyrii  阅读(47)  评论(0)    收藏  举报