
这个题目的意思就是,找出一个图中任意两个点间的最短路,最后统计长度为1,2,3……的条数。其中如果两个点间有多条最短路,只算一条。
这道题其实就是一个Floyd算法的应用。
使用Floyd算出任意两个点间的最短路,再统计。
#include <iostream>
#include <string.h>
using namespace std;
/*全局变量*/
int mp[222][222];
int n, m;
/*自定义函数*/
void Floyd();
int main()
{
while (cin >> n && n)
{
//初始化数据
memset(mp, 0x3f, sizeof(mp));
for (int i = 0; i < n; i++) mp[i][i] = 0;
cin >> m;
int u, v;
for (int i = 0; i < m; i++)//输入地图
{
cin >> u >> v;
mp[u][v] = mp[v][u] = true;
}
Floyd();//寻找最短路
int dist[205];//统计每种长度最短路条数
memset(dist, 0, sizeof(dist));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
dist[mp[i][j]]++;
}
}
for (int i = 1; i <= n; i++)
{
if (dist[i])
{
cout << i << ' ' << dist[i] << endl;
}
}
}
}
/*自定义函数*/
void Floyd()
{
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (mp[i][j] > mp[i][k] + mp[k][j])
{
mp[i][j] = mp[i][k] + mp[k][j];
}
}
}
}
}
240

被折叠的 条评论
为什么被折叠?



