21 条题解
-
0
#include <iostream>#include <vector>#include <queue>#include <cstring>usingnamespace std;// 邻接表存储边:first=目标节点,second=边权typedef pair<int,int> PII;constint INF =0x3f3f3f3f;// 定义无穷大constint MAXN =2005;// 城市数量上限 vector<PII> graph[MAXN];// 邻接表int dist[MAXN];// 存储起点到每个节点的最短距离bool vis[MAXN];// 标记节点是否已确定最短距离// 堆优化Dijkstra算法voiddijkstra(int start,int n){// 初始化:距离无穷大,未访问memset(dist,0x3f,sizeof(dist));memset(vis,false,sizeof(vis)); dist[start]=0;// 小根堆:pair<距离, 节点编号>,优先弹出距离最小的节点 priority_queue<PII, vector<PII>, greater<PII>> q; q.push({0, start});while(!q.empty()){// 取出当前距离最小的节点int d = q.top().first;int u = q.top().second; q.pop();// 该节点已处理过,跳过if(vis[u])continue; vis[u]=true;// 遍历所有邻边for(auto&edge : graph[u]){int v = edge.first;// 邻接节点int w = edge.second;// 边权// 松弛操作:更新最短距离if(dist[v]> dist[u]+ w){ dist[v]= dist[u]+ w; q.push({dist[v], v});}}}}intmain(){ ios::sync_with_stdio(false);// 加速输入输出 cin.tie(nullptr);int n, m; cin >> n >> m;// 构建无向图for(int i =0; i < m;++i){int a, b, c; cin >> a >> b >> c; graph[a].emplace_back(b, c); graph[b].emplace_back(a, c);}int s, t; cin >> s >> t;// 计算最短路径dijkstra(s, n);// 输出结果:不可达输出-1if(dist[t]== INF) cout <<-1<< endl;else cout << dist[t]<< endl;return0;}
信息
- ID
- 380
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 13
- 已通过
- 2
- 上传者