2 条题解
-
0
题目:无向图的直径
给定一个无向图,包含n个顶点和m条边,每条边的权重均为1。请计算该图中所有顶点对之间最短路径的最大值,即“直径”。
解题思路:
- 使用Floyd-Warshall算法计算所有顶点对之间的最短路径,适用于求解全源最短路径问题。
- 初始化距离矩阵,将每个顶点到自身的距离设为0,其余距离初始化为一个较大值(0x0f0f0f0f)。
- 读入m条边,更新距离矩阵中对应顶点间的距离为1(无向图,边权为1)。
- 通过三重循环(中间点、起点、终点)执行Floyd-Warshall算法,更新所有点对的最短路径。
- 遍历所有顶点对,找出最短路径中的最大值,即为图的直径。
#include<bits/stdc++.h> using namespace std; int d[110][110]; int main() { int n, m; scanf("%d%d", &n, &m); memset(d, 0x0f, sizeof(d)); for(int i=1; i<=n; i++) d[i][i] = 0; for(int i=1, x, y; i<=m; i++) { scanf("%d%d", &x, &y); d[x][y] = d[y][x] = 1; } for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); int ans = 0; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) // 原代码此处可能存在笔误,应为j<=n if(d[i][j] != 0x0f0f0f0f) ans = max(ans, d[i][j]); printf("%d\n", ans); return 0; } -
0
#include<bits/stdc++.h> using namespace std; int d[110][110]; int main() { int n,m; scanf("%d%d",&n,&m); memset(d,0x0f,sizeof(d)); for(int i=1;i<=n;i++) d[i][i]=0; for(int i=1,x,y;i<=m;i++) { scanf("%d%d",&x,&y); d[x][y]=d[y][x]=1; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); int ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(d[i][j]!=0x0f0f0f0f) ans=max(ans,d[i][j]); printf("%d\n",ans); return 0; }
- 1
信息
- ID
- 1474
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 3
- 标签
- 递交数
- 54
- 已通过
- 28
- 上传者