poj 1847最短路flody

来源:互联网 发布:阿里云虚拟服务器 编辑:程序博客网 时间:2024/05/21 11:12

题目理解起来有点费劲,大概说一下吧!

就是有n个交叉点,就当做有n个点就行,然后这些点和其他点有些路径,每个点是一个开关,开关只能有一个方向走一条路,而第一个数就是默认的开关指向,不用旋转。

这单犯了个错,就是默认的指向实际上只需要旋转0次,而其他路径只需要旋转1次,无论是哪条,只需1次,当初以为,第二个1次,第3个2次。

 

题目给的实例

3 2 1 //有3个开关点,计算从第二个到第一个最少需要旋转几次

2 2 3//第1个开关可以通向2 和3 ,通向2不需要旋转,通向3需要旋转1次

2 3 1//第2个开关可以通向3 和1, 通向3不需要旋转,通向1需要旋转1次

2 2 1//第一个开关通向2,所以最终的旋转次数为0

代码:

Flody

#include<cstdio>#include<string>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;int a[102][102];#define MAX 100000int N; void flody(){int i,j,k;for(k=1;k<=N;k++)for(i=1;i<=N;i++)for(j=1;j<=N;j++)a[i][j]=min(a[i][j],a[i][k]+a[k][j]);}void init(){int i,j;for(i=1;i<=N;i++)for(j=1;j<=N;j++){if(i==j) a[i][j]=0;else a[i][j]=MAX;}}int main(){int A,B,i,j,k,t;cin>>N>>A>>B;init();for(i=1;i<=N;i++){cin>>k;for(j=1;j<=k;j++){cin>>t;if(j==1) a[i][t]=0;else  a[i][t]=1; }}flody();if(a[A][B]==MAX)  cout<<-1<<endl;else  cout<<a[A][B]<<endl;return 0;}


 

原创粉丝点击