Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 13468 | Accepted: 4954 |
Description
When a driver has do drive from intersection A to the intersection B he/she tries to choose the route that will minimize the number of times he/she will have to change the switches manually.
Write a program that will calculate the minimal number of switch changes necessary to travel from intersection A to intersection B.
Input
Each of the following N lines contain a sequence of integers separated by a single blank character. First number in the i-th line, Ki (0 <= Ki <= N-1), represents the number of rails going out of the i-th intersection. Next Ki numbers represents the intersections directly connected to the i-th intersection.Switch in the i-th intersection is initially pointing in the direction of the first intersection listed.
Output
Sample Input
3 2 1 2 2 3 2 3 1 2 1 2
Sample Output
0
Source
原题链接:http://poj.org/problem?id=1847
就是有n个交叉点,就当做有n个点就行,然后这些点和其他点有些路径,每个点是一个开关,开关只能有一个方向走一条路,而第一个数就是默认的开关指向,不用旋转。
这单犯了个错,就是默认的指向实际上只需要旋转0次,而其他路径只需要旋转1次,无论是哪条,只需1次,当初以为,第二个1次,第3个2次。
题目给的实例
3 2 1 //有3个开关点,计算从第二个到第一个最少需要旋转几次
2 2 3//第1个开关可以通向2个开关,即2 和3 ,通向2不需要旋转,通向3需要旋转1次
2 3 1//第2个开关可以通向2个开关,即3 和1, 通向3不需要旋转,通向1需要旋转1次
2 1 2//第3个开关可以通向2个开关,即1和2, 通向1不需要旋转,通向2需要旋转1次
知道题目意思后还有问题吗?
Dijkstra算法,Floyd算法,spfa算法都来了!!
AC代码:
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int INF=0x3f3f3f3f;
int a[105][105];
int dis[105];
bool vis[105];
int n,s,t;
void Dij()
{
for(int i=1; i<=n; i++)
{
dis[i]=a[s][i];
vis[i]=false;
}
vis[s]=true;
dis[s]=0;
for(int i=1; i<=n; i++)
{
int minn=INF;
int p;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
p=j;
}
}
vis[p]=true;
//if(minn==INF) break;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>dis[p]+a[p][j])
dis[i]=dis[p]+a[p][j];
}
}
}
void floyd() //floyd 算法
{
for (int i = 1; i <= n; ++ i)
{
for (int j = 1; j <= n; ++ j)
{
for (int k = 1; k <= n; ++ k)
{
if (a[j][k] > a[j][i] + a[i][k])
{
a[j][k] = a[j][i] + a[i][k];
}
}
}
}
if (a[s][t] >= INF)
printf("-1\n");
else
printf("%d\n", a[s][t]);
}
void spfa()
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
vis[i]=false;
}
dis[s]=0;
vis[s]=true;
queue<int>q;
q.push(s);
while(!q.empty())
{
int p=q.front();
q.pop();
vis[p]=false;///!!!!!!
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[p]+a[p][i])
{
dis[i]=dis[p]+a[p][i];
if(!vis[i])
{
vis[i]=true;
q.push(i);
}
}
}
}
}
int main()
{
while(cin>>n>>s>>t)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
if(i==j) a[i][j]=0;
else a[i][j]=INF;
}
int x,y,z;
for(int i=1; i<=n; i++)
{
scanf("%d",&x);
for(int j=0; j<x; j++)
{
scanf("%d",&y);
if(j==0)
a[i][y]=0;
else
a[i][y]=1;
}
}
//floyd();
//Dij();
spfa();
if(dis[t]<INF)
cout<<dis[t]<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}