zoukankan      html  css  js  c++  java
  • luogu P1346电车(克鲁斯卡尔)

    题目描述

    在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能)。在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开关所指向的轨道出去,如果电车司机想走另一个轨道,他就必须下车切换开关的状态。

    为了行驶向目标地点,电车司机不得不经常下车来切换开关,于是,他们想请你写一个程序,计算一辆从路口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
    题解
    我们可以把输入数据转换成这样的一个图:这个车站到默认开关指向的车站边权为0,到的其他车站边权为1,于是此题变为求两个点之间的最短路径...
    还要特判不能到达的情况。
    #include<bits/stdc++.h>
    using namespace std;
    const int maxx=100000;
    int n,s,e;
    int c[103];
    bool b[103];
    int f[103][103]; 
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>n>>s>>e;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                f[i][j]=maxx;
        for(int i=1;i<=n;i++)
        {
            int sum;
            cin>>sum;
            bool a=true;
            for(int j=1;j<=sum;j++)
            {
                int z; 
                cin>>z;
                if(a==true)
                    f[i][z]=0,a=false;
                else
                    f[i][z]=1;
            }
        }
        memset(b,false,sizeof(b));
        b[s]=true;
        for(int i=1;i<=n;i++)
            c[i]=f[s][i];
        c[s]=0;
        for(int i=1;i<=n;i++)
        {
            int minl,k;
            minl=maxx;
            k=0;
            for(int j=1;j<=n;j++)
                if(b[j]==false&&c[j]<minl)
                    minl=c[j],k=j;
            if(k==0)
                break;
            b[k]=true;
            for(int j=1;j<=n;j++)
                if(c[k]+f[k][j]<c[j])
                    c[j]=c[k]+f[k][j];
        }
        if(c[e]!=maxx)
            cout<<c[e];
        else
            cout<<"-1"; 
        return 0;
    }
  • 相关阅读:
    函数
    python操作文件
    POJ-2689-Prime Distance(素数区间筛法)
    POJ-2891-Strange Way to Express Integers(线性同余方程组)
    POJ-2142-The Balance
    POJ-1061-青蛙的约会(扩展欧几里得)
    Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing
    Educational Codeforces Round 75 (Rated for Div. 2) C. Minimize The Integer
    Educational Codeforces Round 75 (Rated for Div. 2) B. Binary Palindromes
    Educational Codeforces Round 75 (Rated for Div. 2) A. Broken Keyboard
  • 原文地址:https://www.cnblogs.com/Alarak26/p/8516847.html
Copyright © 2011-2022 走看看