http://tyvj.cn/p/1083
以C小朋友为起点求最短路,任何一种都行,然后找出离C小朋友最远距离ans,答案是ans+m+1
代码是SPFA求最短路,当然可以用Floyd/dijkstra等等
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int w[1005][1005];
int num[1005];
bool visit[1005];
int dis[1005];
int h[10005];
int f[1005][1005];
int main ()
{
int n,p,c,m;
scanf("%d%d%d%d", &n ,&p, &c, &m);
memset(w, 27, sizeof(w));
memset(num, 0, sizeof(num));
for (int i=1;i<=p;i++)
{
int a,b;
scanf("%d%d", &a, &b);
w[a][b]=w[b][a]=1;
f[a][++num[a]] = b;
f[b][++num[b]] = a;
}
memset(visit, false, sizeof(visit));
memset(dis, 27, sizeof(dis));
dis[c] = 0;
int head = 0, tail = 1;
h[1] = c; visit[c] = true;
do {
head++;
int u = h[head];
visit[u] = false;
for (int i=1;i<=num[u];i++)
{
int v = f[u][i];
if (dis[v]>dis[u]+w[u][v])
{
dis[v] = dis[u]+w[u][v];
if (!visit[v]) h[++tail] = v;
}
}
} while (head < tail);
int ans = 0;
for (int i=1;i<=n;i++)
{
ans = max(ans, dis[i]);
}
printf("%d\n", ans+m+1);
return 0;
}