POJ1847 floyd求最短路径

http://poj.org/problem?id=1847

题意:这题关键是题意理解了就会做了。

大致题意:现在有一铁路网络,有n个交叉点,和一些开关。通过开关可以改变路线方向,使其能驶向其他交叉点。

开关的初始状态已知,即(初始直接某两点直接相连)。A到B.

问从出发点到目的地最少要动多少开关才能到达。

分析:想想就会发现是最短路问题。假如要从1--3如果有直接连接的边则不要动开关,如果要通过1-2,2-3则需要懂开关一次。这题就是找从出发点到目的地最少要动多少开关才能到达。

算法:dijkstra||floyd都行。这里用floyd,反正数据不大才100.不过要改下状态方程。接存在的边权设为0,间接相连的边,其权设为1,那么从出发点到目的地的最短路也就记录了最少要用的开关数。

dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]).

View Code
// I'm lanjiangzhou
//C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
//C++
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cctype>
#include <stack>
#include <string>
#include <list>
#include <queue>
#include <map>
#include <vector>
#include <deque>
#include <set>
using namespace std;

//*************************OUTPUT*************************
#ifdef WIN32
#define INT64 "%I64d"
#define UINT64 "%I64u"
#else
#define INT64 "%lld"
#define UINT64 "%llu"
#endif

//**************************CONSTANT***********************
#define INF 0x3f3f3f3f
#define eps 1e-8
#define PI acos(-1.)
#define PI2 asin (1.);
typedef long long LL;
//typedef __int64 LL;   //codeforces
typedef unsigned int ui;
typedef unsigned long long ui64;
#define MP make_pair
typedef vector<int> VI;
typedef pair<int, int> PII;
#define pb push_back
#define mp make_pair

//***************************SENTENCE************************
#define CL(a,b) memset (a, b, sizeof (a))
#define sqr(a,b) sqrt ((double)(a)*(a) + (double)(b)*(b))
#define sqr3(a,b,c) sqrt((double)(a)*(a) + (double)(b)*(b) + (double)(c)*(c))

//****************************FUNCTION************************
template <typename T> double DIS(T va, T vb) { return sqr(va.x - vb.x, va.y - vb.y); }
template <class T> inline T INTEGER_LEN(T v) { int len = 1; while (v /= 10) ++len; return len; }
template <typename T> inline T square(T va, T vb) { return va * va + vb * vb; }

// aply for the memory of the stack
//#pragma comment (linker, "/STACK:1024000000,1024000000")
//end

const int maxn = 200;
int dis[maxn][maxn];
int n,A,B;
void floyd(){
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
}


int main(){
    while(scanf("%d%d%d",&n,&A,&B)!=EOF){
        int x;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                dis[i][j]=INF;
            }
            dis[i][i]=0;
        }
        int m;
        for(int i=1;i<=n;i++){
            scanf("%d",&m);
            for(int j=1;j<=m;j++){
                scanf("%d",&x);
                //dis[x][i]=0;
                if(j>=2){
                    dis[i][x]=1;
                  //  dis[x][i]=1;
                }
                else if(j==1)
                    dis[i][x]=0;
            }
        }
        floyd();
        if(dis[A][B]==INF){
            printf("-1\n");
        }
        else printf("%d\n",dis[A][B]);
    }
    return 0;
}

 

posted @ 2013-04-02 16:52  南下的小程序员  阅读(164)  评论(0编辑  收藏  举报