1 条题解
-
1
本题直接使用floyd算法即可。
因为每条边都有两个信息,所以需要定义一个结构体存储邻接矩阵(邻接表更好,
但我不会呀)struct road { int d , p; }e[1005][1005];
还要注意数据的输入,最终的框架如下:
scanf("%d %d" , &n , &m); do { //floyd算法 scanf("%d %d" , &n , &m);//注意,一定是在最后输入,位置不能变! } while (n && m);
还有一点需要注意,由于道路是双向的,所以在松弛时要将回去的路径也缩短,
否则我也不会错那么多次了:for (int i = 1 ; i <= n ; i++) for (int j = 1 ; j <= n ; j++) for (int k = 1 ; k <= n ; k++) if (e[j][k].d > e[j][i].d + e[i][k].d){ e[j][k].d = e[j][i].d + e[i][k].d; e[j][k].p = e[j][i].p + e[i][k].p; e[k][j].d = e[j][i].d + e[i][k].d; e[k][j].p = e[j][i].p + e[i][k].p; }
AC Code:
#include <bits/stdc++.h> using namespace std; #define inf 1e9; struct road { int d , p; }e[1005][1005]; int n , m , a , b , s , t; int main() { scanf("%d %d" , &n , &m); do { for (int i = 1 ; i <= m ; i++) { scanf("%d %d" , &a , &b); scanf("%d %d" , &e[a][b].d , &e[a][b].p); } scanf("%d %d" , &s , &t); //初始化 for (int i = 1 ; i <= n ; i++) for (int j = 1 ; j <= n ; j++) if (e[i][j].d == 0 && i != j) e[i][j].d = inf; for (int i = 1 ; i <= n ; i++) for (int j = 1 ; j <= n ; j++) for (int k = 1 ; k <= n ; k++) if (e[j][k].d > e[j][i].d + e[i][k].d){ e[j][k].d = e[j][i].d + e[i][k].d; e[j][k].p = e[j][i].p + e[i][k].p; e[k][j].d = e[j][i].d + e[i][k].d; e[k][j].p = e[j][i].p + e[i][k].p; } printf("%d %d\n" , e[s][t].d , e[s][t].p); scanf("%d %d" , &n , &m);//注意,一定是在最后输入,位置不能变! } while (n && m); return 0; }
- 1
信息
- ID
- 1140
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 18
- 已通过
- 13
- 上传者