zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    训练20191009 2018-2019 ACM-ICPC, Asia East Continent Finals
    [学习笔记] 有上下界网络流
    [HDU4609] 3-idiots
    [HDU1402] A * B Problem Plus
    [HNOI2017] 礼物
    训练20191007 2017-2018 ACM-ICPC Latin American Regional Programming Contest
    [ZJOI2014] 力
    训练20191005 2017-2018 ACM-ICPC Asia East Continent League Final
    [一本通学习笔记] 树链剖分
    [一本通学习笔记] 快速幂
  • 原文地址:https://www.cnblogs.com/lanjiangzhou/p/2995841.html
Copyright © 2011-2022 走看看