1.Flord算法求出任意两点之间的最短距离
2.ans数组保存长度为i的最短路的数量,即ans[i] 代表长度为i的最短路有ans[i]条
PS:题目里有这么一句话how many shortest paths are there for each length (from 1 to the maximal length).所以要求出maximal length,输出时从长度为1到maximal length 进行输出
这道题是我敲得,就没什么好说的了
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int maxn = 200 + 10;
struct edge
{
int from,to,cost;
};
int n,m,d[maxn][maxn],ans[maxn];
vector<int> g[maxn];
vector<edge> e;
void init()
{
for(int i=0;i<n;i++) g[i].clear();
e.clear();
}
int main()
{
int x,y;
while(scanf("%d",&n) && n)
{
init();
scanf("%d",&m);
memset(ans,0,sizeof(ans));
memset(d,INF,sizeof(d));
for(int i=0;i<n;i++) d[i][i] = 0;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
d[x][y] = 1;
d[y][x] = 1;
}
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
d[i][j] = min(d[i][k] + d[k][j],d[i][j]);
}
}
}
int len = 1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
ans[d[i][j]]++;
len = max(len,d[i][j]);
}
}
for(int i=1;i<=len;i++)
{
printf("%d %d\n",i,ans[i]);
}
}
return 0;
}