zoukankan      html  css  js  c++  java
  • 电车----图论最短路

    题目描述

    在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能)。在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开关所指向的轨道出去,如果电车司机想走另一个轨道,他就必须下车切换开关的状态。
    为了行驶向目标地点,电车司机不得不经常下车来切换开关,于是,他们想请你写一个程序,计算一辆从路口A到路口B最少需要下车切换几次开关。

    输入

    第一行有3个整数2<=N<=100,1<=A,B<=N,分别表示路口的数量,和电车的起点,终点。
    接下来有N行,每行的开头有一个数字Ki(0<=Ki<=N-1),表示这个路口与Ki条轨道相连,接下来有Ki个数字表示每条轨道所通向的路口,开关默认指向第一个数字表示的轨道。

    输出

    输出只有一个数字,表示从A到B所需的最少的切换开关次数,若无法从A前往B,输出-1。

    样例输入

    3 2 1
    2 2 3
    2 3 1
    2 1 2
    

    样例输出

    0

    提示

    20%数据 n<=20
    100%数据 n<=100

    #pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
    #pragma GCC optimize("Ofast")
    #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    #pragma comment(linker, "/stack:200000000")
    #pragma GCC optimize (2)
    #pragma G++ optimize (2)
    #include <bits/stdc++.h>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <set>
    #include <stack>
    #include <string>
    #include <vector>
    using namespace std;
    #define wuyt main
    typedef long long ll;
    #define HEAP(...) priority_queue<__VA_ARGS__ >
    #define heap(...) priority_queue<__VA_ARGS__,vector<__VA_ARGS__ >,greater<__VA_ARGS__ > >
    template<class T> inline T min(T &x,const T &y){return x>y?y:x;}
    template<class T> inline T max(T &x,const T &y){return x<y?y:x;}
    //#define getchar()(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
    //char buf[(1 << 21) + 1], *p1 = buf, *p2 = buf;
    ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
    if(c == '-')Nig = -1,c = getchar();
    while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
    return Nig*x;}
    #define read read()
    const ll inf = 1e15;
    const int maxn = 2e3 + 7;
    const int mod = 1e9 + 7;
    #define start int wuyt()
    #define end return 0
    ll n,ans,k,f,t,number[maxn][maxn];
    struct node{
        int sum;
        int num;
    }a[maxn];
    bool cmp(node a,node b)
    {
        if(a.sum!=b.sum) return a.sum>b.sum;
        else return a.num<b.num;
    }
    void dfs(int sum, unsigned char ss){
        if(sum>n)
            return;
        if(ss==07)
            ans++;
        if(sum<99999999){
            dfs(sum*10+3,ss|1);
            dfs(sum*10+5,ss|2);
            dfs(sum*10+7,ss|4);
        }
    }
    ll superpow(ll a,ll b,ll c){
        ll ans=1;
        ll temp=a;
        while(b){
            if(b&1) ans=(ans*temp)%c;
            temp=(temp*temp)%c;
            b>>=1;
        }
        return ans;
    }
    start{
        /**
        ll x=read;
        if(x==7||x==5||x==3)
            printf("YES
    ");
        else
            printf("NO
    ");
        string s;
        cin>>s;
        int len=s.size();
        int ans=999;
        for(int i=0;i<=len-3;++i)
        {
            int num=(s[i]-'0')*100+(s[i+1]-'0')*10+(s[i+2]-'0');
            ans=min(abs(num-753),ans);
        }
        cout<<ans;
        n=read;
        dfs(0,0);
        cout<<ans;
        n=read,k=read;
        for(int i=1;i<=10;i++) e[i]=read;
        for(int i=1;i<=n;i++) {
            a[i].sum=read;
            a[i].num=i;
        }
        sort(a+1,a+1+n,cmp);
        for(int i=1;i<=n;i++)
            a[i].sum+=e[(i-1)%10+1];
        sort(a+1,a+1+n,cmp);
        for(int i=1;i<=k;i++)
        {
            if(i==1)
                printf("%d",a[i].num);
            else
                printf(" %d",a[i].num);
        }
        printf("
    ");
        n=read,k=read;
        printf("%lld
    ",(superpow(3,n-1,k<<1)+1)>>1);**/
        n=read;
        f=read;
        t=read;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                number[i][j]=mod;
                number[i][i]=0;
            }
        for(int i=1;i<=n;i++)
        {
            k=read;
            for(int j=1;j<=k;j++){
                int a=read;
                if(j==1) number[i][a]=0;
                else number[i][a]=1;
            }
        }
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    number[i][j]=min(number[i][j],number[i][k]+number[k][j]);
                }
            }
        }
        if(number[f][t]==mod) printf("-1
    ");
        else
            printf("%d
    ",number[f][t]);
        end;
    }
    
  • 相关阅读:
    iOS开发系列--通知与消息机制(转)
    iOS Storyboard全解析(转)
    在IOS代码中使用UNIX命令
    如何用代码实现iPhone手机软件注销和手机重启
    ios多线程开发 GCD常见用法
    ios多线程开发 GCD的基本使用
    ios错误码:NSError对象.code
    iOS9 HTTP请求失败
    (转)空指针和野指针
    (转)ARC指南
  • 原文地址:https://www.cnblogs.com/PushyTao/p/13144210.html
Copyright © 2011-2022 走看看