题目http://poj.org/problem?id=1847
题意,就是有n个交叉点,就当做有n个点就行,然后这些点和其他点有些路径,每个点是一个开关,开关只能有一个方向走一条路,而第一个数就是默认的开关指向,不用旋转。
这单犯了个错,就是默认的指向实际上只需要旋转0次,而其他路径只需要旋转1次,无论是哪条,只需1次,当初以为,第二个1次,第3个2次。
#include <iostream>
#include <string>
#include<cstring>
#include <stdlib.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define MaxN 1100
#define MaxInt 200000000
int map[MaxN][MaxN],dist[MaxN];
bool mark[MaxN];
int n,start,end;
void dij(){
//初始化
int i,j,mini,minip;
for(int i=1;i<=n;i++)
dist[i]=MaxInt;
memset(mark,0,sizeof(mark));
dist[start]=0;
//在开始循环的时候,没有把mark[start]标为1,而是通过第一次循环,找到start点,其实都一样了
for(int i=1;i<=n;i++){
mini=MaxInt;
for(j=1;j<=n;j++){
if(!mark[j]&&dist[j]<mini){
mini=dist[j];
minip=j;
}
}
mark[minip]=1;
for(j=1;j<=n;j++){
if(!mark[j]&&dist[j]>dist[minip]+map[minip][j])
dist[j]=dist[minip]+map[minip][j];
}
}
}
int main()
{
int a,b;
//输入
//scanf("%d%d%d",&n,&start,&end);
while(scanf("%d%d%d",&n,&start,&end)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=map[j][i]= MaxInt;
for(int i=1;i<=n;i++)//
{
scanf("%d",&a);
for(int j=0;j<a;j++)
{
scanf("%d",&b);
if(j==0)
map[i][b]=0;
else
map[i][b]=1;
}
}
dij();
if(dist[end]!=MaxInt)
printf("%d\n",dist[end]);
else
printf("-1\n");}
//system("pause");
return 0;
}
题