|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码
正确输出 :
但是我这个不能 , 不知道哪里有问题 , 求指出 |
|