/*
思路:
关键是在建立邻接矩阵的时候,一定要理清思路:
由于每一个交叉口,默认第一个是通的,所以不要去改一次,为0;
其他的路,要改一次,(不管是那个路口), 为1;
以上面为标准,建立邻接矩阵,最后用最短路径的算法做一篇,就好了;
*/
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int INF = 1000;
const int MAX = 200;
int maze[MAX][MAX];
int N, A, B;
int flag[MAX];
int dis[MAX];
void init(){
for(int i=1; i<=N; ++i){
for(int j=1; j<=N; ++j){
maze[i][j] = INF;
}
}
}
void dijstra(int start){
int temp, local;
for(int i=1; i<=N; ++i){
flag[i] = 0;
dis[i] = maze[start][i];
}
flag[start] = 1;
for(int i=1; i<N; ++i){
temp = INF;
for(int j=1; j<=N; ++j){
if(!flag[j] && temp > dis[j]){
temp = dis[j];
local = j;
}
}
flag[local] = 1;
for(int j=1; j<=N; ++j){
if(!flag[j] && dis[j] > dis[local] + maze[local][j]){
dis[j] = dis[local] + maze[local][j];
}
}
}
if(dis[B] == INF){
printf("%d\n", -1);
}else{
printf("%d\n", dis[B]);
}
}
int main(){
int count, v;
{
scanf("%d %d %d", &N, &A, &B);
init();
for(int i=1; i<=N; ++i){
scanf("%d", &count);
for(int j=1; j<=count; ++j){
scanf("%d",&v);
if(j==1){
maze[i][v] = 0;
}else{
maze[i][v] = 1;
}
}
}
dijstra(A);
}
return 0;
}
POJ 1847
最新推荐文章于 2021-09-30 20:48:01 发布