POJ 1847 Tram【Floyd】

题意:给出n个站点,每个站点都有铁路通向其他站点 如果当前要走得路恰好是该站点的开关指向的铁路,则不用扳开关,否则要手动扳动开关,给出起点和终点,问最少需要扳动多少次开关

输入的第一行是n,start,end

接下来的n行,每一行中,第一个数是该站点向外连接的铁路条数,

第二个数是该站点的开关指向的铁路(因为这儿没有读懂= =所以都建不出图来--5555参见这一句话:Switch in the i-th intersection is initially pointing in the direction of the first intersection listed.)

所以直接指向的w=0(即为不需要扳动开关)

没有直接指向的w=1(即为需要扳动开关)

建出图来,再求最短路就可以了

因为n<=100,所以可以用floyd来做

学习的这一篇:http://blog.csdn.net/freezhanacmore/article/details/8619040

 1 #include<iostream>  

 2 #include<cstdio>  

 3 #include<cstring> 

 4 #include <cmath> 

 5 #include<stack>

 6 #include<vector>

 7 #include<map> 

 8 #include<set>

 9 #include<queue> 

10 #include<algorithm>  

11 #define mod=1e9+7;

12 using namespace std;

13 

14 typedef long long LL;

15 const int INF = 10000000;

16 const int maxn=110;

17 int d[maxn][maxn];

18 

19 int main(){

20     int n,a,b,i,j,k,num,x;

21     scanf("%d %d %d",&n,&a,&b);

22         for(i=1;i<=n;i++){ //初始化 

23             for(j=1;j<=n;j++){

24                 if(i==j) d[i][j]=0;

25                 else d[i][j]=INF;

26             }

27         }

28         

29         for(i=1;i<=n;i++){//建图 

30             scanf("%d",&num);

31             for(j=1;j<=num;j++){

32                 scanf("%d",&x);

33                 if(j==1) d[i][x]=0;



34                 else d[i][x]=1;

35             }            

36         }

37         

38         for(k=1;k<=n;k++)

39           for(i=1;i<=n;i++)

40             for(j=1;j<=n;j++)

41             d[i][j]=min(d[i][j],d[i][k]+d[k][j]);

42             

43             if(d[a][b]==INF) printf("-1\n");

44             else printf("%d\n",d[a][b]);

45             

46             return 0;

47 }
View Code

 

 

 

 

第一道最短路的题目--

go--go--go

 

你可能感兴趣的:(floyd)