洛谷 1346 电车

题目大意

一个有向图,求第A个点到第b个点的最小的长度。

思路

数据很弱,直接floyed就可以过了,注意预处理。

代码

#include
#define INF 2147483648
#define r(i,a,b) for (int i=a;i<=b;i++)
using namespace std;int n,c,d,k;
int l[101][101],e;
int min(int x,int y){return xy?x:y;}
void read(int &f)
{
    f=0;char c;bool d=0;
    while (c=getchar(),c<'0'||c>'9') if (c=='-') d=1;f=f*10+c-48;
    while (c=getchar(),c>='0'&&c<='9') f=f*10+c-48;
    if (d) f*=-1;
}
void write(int x)
{
       if (x<0) {putchar('-');x=-x;}
    if (!x) {putchar(48);return;}
    if (!(x/10)){putchar(x%10+48);return;}
    write(x/10);putchar(x%10+48);
}
void LRZ()
{
    read(n);read(c);read(d);r(i,0,100)r(j,0,100) l[i][j]=l[j][i]=INF/4;
    r(i,1,n)
    {
        read(k);r(j,1,k) {read(e);if (j==1) l[i][e]=false;else l[i][e]=1;}//输入
    }
}void print();
void work()
{
    r(k,1,n)
     r(i,1,n)
      r(j,1,n)
       if (i!=j&&j!=k&&k!=i)
        l[i][j]=min(l[i][j],l[i][k]+l[k][j]);//floyed
    print();
}
void print()
{
    if (l[c][d]==INF/4) write(-1);else write(l[c][d]);
}
int main()
{
    LRZ();
    work();
}




你可能感兴趣的:(GT,最短路)