您的位置:首页 > 其它

洛谷 1346 电车

2018-01-13 18:41 281 查看
题目大意

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

思路

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

代码

#include<cstdio>
#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 x<y?x:y;}
int max(int x,int y){return x>y?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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: