http://acm.hust.edu.cn/vjudge/contest/121378#problem/N

 

题意:一辆火车从某点A开向某点B,在这一路上,有很多的岔口,默认的是第一条岔口,若想改变岔口的方向,则可以通过开关来改变,问你到达最终地点B时,一共改变开关的次数为多少。

**********单源求最短路问题(一开始写成双向的,我也是很无语很受伤啊)

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;

#define maxn 110
#define oo 0x3f3f3f3f
int maps[maxn][maxn], v[maxn], dist[maxn];
int n, a, b;

void Init()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            if(i==j) maps[i][j] = 0;
            else maps[i][j] = maps[j][i] = oo;
        }
    }
}

void Dij()
{
    memset(v, 0, sizeof(v));

   for(int i=1; i<=n; i++)
    dist[i] = maps[a][i];

   v[a] = 1;

   for(int i=1; i<n; i++)
   {
       int index=-1, mins=oo;

       for(int j=1; j<=n; j++)
       {
           if(!v[j] && dist[j]<mins)
           {
               index=j;
               mins=dist[j];
           }
       }

       v[index] = 1;

       for(int j=1; j<=n; j++)
       {
           if(!v[j] && dist[j]>mins+maps[index][j])
            dist[j] = mins+maps[index][j];
       }
   }

   if(dist[b] == oo)
    printf("-1\n");
   else
    printf("%d\n", dist[b]);
}

int main()
{
     int num, c;

     scanf("%d %d %d", &n, &a, &b);

     Init();

     for(int i=1; i<=n; i++)
     {
          scanf("%d", &num);

         for(int j=1;j<=num; j++)
          {
              scanf("%d", &c);

              int p = 1;
              if(j == 1)
                p = 0;

            maps[i][c] = min(p, maps[i][c]);
          }
     }

    Dij();

    return 0;
}
View Code

 

posted on 2016-07-24 09:35  不忧尘世不忧心  阅读(169)  评论(0编辑  收藏  举报