马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 柿子饼同学 于 2022-7-4 23:03 编辑
题目在下, 代码 :
https://www.luogu.com.cn/problem/P3371
#include <bits/stdc++.h>
using namespace std;
#define inf 999999999
int n, m, s;
int mp[1002][1002]; // mp[x][y] : x -> y 邻接矩阵存有向图 , [x][y] 代表 x - > y
int start;
int dist[1002]; // start -> dist[v] 最短路径 start 到 dist v 的最短路
int pre[1002]; // prenode[v] -> v 就是v的前驱节点
bool isused[1002];
void Dijkstra(int start){
fill(dist, dist+1002, inf); // 初始化
for(int i = 1; i < n; i++){
if(mp[start][i]) dist[i] = mp[start][i]; // 与开始节点的连线 , 不然就是 inf
}
dist[start] = 0;
isused[start] = 1;
pre[start] = 0; // INIT 初始化
for(int i = 1; i <= n; i++){
int mindist = inf;
int u = start;
for(int j = 1; j <= n; j++){ // 找到与 开始节点 联通且边权最小的节点 u
if(!isused[j] && dist[j] < mindist){
mindist = dist[j];
u = j;
}
}
isused[u] = 1; // u 用过了
for(int j = 1; j <= n; j++){ // 找到与 u 相邻且权值最小的节点
if(!isused[j] && mp[u][j] != 0){
int newdist = mp[u][j] + dist[u]; // 更新 dist
if(newdist < dist[j]){
dist[j] = newdist;
pre[j] = u;
}
}
}
}
}
int main(){
ios::sync_with_stdio(0);
memset(mp, 0, sizeof(mp));
cin >> n >> m >> s;
for(int i = 0; i < m; i++){
int u, v, w;
cin >> u >> v >> w;
mp[u][v] = w;
}
Dijkstra(s);
for(int i = 1; i <= n; i++){
cout << dist[i] << ' ';
}
return 0;
}
测试用例 2 :5 15 5
2 5 181
1 5 98
4 2 49
3 2 262
4 3 26
2 4 192
5 1 221
2 2 254
4 4 233
1 5 44
5 4 67
4 2 214
1 1 47
1 1 118
5 4 3
正确输出 :但是我这个不能 , 不知道哪里有问题 , 求指出 |