poj 1847最短路flody

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

就是有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 100000
int 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;
}


 

你可能感兴趣的:(poj 1847最短路flody)