现在的位置: 首页 > 综合 > 正文

poj 1847 Tram(floyd)

2018年03月17日 ⁄ 综合 ⁄ 共 897字 ⁄ 字号 评论关闭
题意:有N个点 接下来的N行分别为点i的情况:第一个数字k表示与该点连通的点的个
数,接下来输入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 ()
{
    int
n,src,des,i,j,k,m;
    while
(~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];

抱歉!评论已关闭.