前面用dijstra写过了。但是捏。数据很小。也可以用Floyd来写。
注意题目里给出的是有向的权值。
附代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#define inf 0x1f1f1f1f
using namespace std;
int n, a, b;
int num;
int dis[210][210];
int i, j, k;
int main()
{
while (cin >> n >> a >> b)
{
memset(dis, inf, sizeof(dis));
for (i=1; i<=n; ++i)
{
int t;
cin >> num;
if (num == 0) continue;
cin >> t;
dis[i][t] = 0; // 默认指向是第一个。
//dis[t][i] = 0; // 单向的。给出的是从i到t的权值。
for (j=2; j<=num; ++j)
{
cin >> t;
//dis[t][i] = 1;
dis[i][t] = 1;
}
}
for (k=1; k<=n; ++k)
{
for (i=1; i<=n; ++i)
{
for (j=1; j<=n; ++j)
{
if (dis[i][j] > dis[i][k] + dis[k][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
if (dis[a][b] != inf)
cout << dis[a][b] << endl;
else cout << -1 << endl;
}
return 0;
}