数,接下来输入k个数,表示与点i相连的点的编号,第一个所连的点为不用
手动改而直接通过,其余的点通过的话要改一次,求从A点到B点改扳手的最小次数。
思路:单源最短路问题。此题注意 Switch in the i-th intersection is initially
pointing in the direction of the first intersection
listed.(第一个所边的点不用手动改) 数据量不是很大,用floyd 0MS AC!!
//216K
0MS
#include
#include
#define M 105
const int inf = 0x3f3f3f3f;
int mat[M][M];
int main ()
{
n,src,des,i,j,k,m;
(~scanf ("%d%d%d",&n,&src,&des))
memset (mat,0x3f,sizeof(mat));
for (i = 1; i <= n; i ++)
{
scanf ("%d",&m);
for (j = 0;j < m;j ++)
{
scanf ("%d",&k);
if (j ==
0)
//第一个相连不用手动改道
mat[i][k] = 0;
else
mat[i][k] = 1;
}
}
for (k = 1; k <= n; k ++)
for (i = 1; i <= n; i ++)
for (j = 1; j <= n; j ++)
if (mat[i][k]+mat[k][j] < mat[i][j])
mat[i][j] = mat[i][k] + mat[k][j];