7-4 Dijkstra Sequence (30 分)

本文深入探讨了Dijkstra算法,通过手动模拟揭示其内在运行规律。适合希望理解和掌握Dijkstra算法的读者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考查知识点:
Dijkstra算法
手动模拟一下就能看出规律

#include <iostream>
#include <cstdio>
#include <stack>
#include <algorithm> 
#include <vector> 
using namespace std;
const int N =1e3+3;
const int INF = 0x3f3f3f3f;
vector<int> tmp, path; 
int G[N][N];
int n, m;
int d[N]; 
bool Dijkstra(int s){
	fill(d, d+N, INF);
	bool vis[N] = {false}; 
	d[s] = 0;
	for(int i = 0; i < n; i++){
		int u = -1, Min = INF;
		for(int j = 1; j <= n; j ++){
			if(!vis[j] && d[j] < Min){
				u = j; 
				Min = d[j]; 
			}
		}
		if(u == -1 || d[u] != d[path[i]]) return false; 
		vis[u] = true;
		for(int v = 1; v <= n; v++){
			if(!vis[v] && G[u][v] + d[u] < d[v] ){
				d[v] =  G[u][v] + d[u]; 
			}
		} 
	}
	return true; 
} 


int main(){
	cin>>n>>m;
	int u, v, w; 
	fill(G[0], G[0]+N*N, INF); 
	while(m--){
		cin>>u>>v>>w;
		G[u][v] = w;
		G[v][u] = w; 
	}
	int k, x; 
	cin>>k;
	while(k--){
	 	 path.clear();
	 	 tmp.clear(); 
		 for(int i = 0; i < n; i ++){
		 	cin>>x;
			path.push_back(x); 
		 } 
		 if(Dijkstra(path[0])) cout<<"Yes"<<endl;
		 else cout<<"No"<<endl; 
	 } 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值