记录编号 34010 评测结果 AAAAAAAAAA
题目名称 [NOI 1997]最优乘车 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.325 s
提交时间 2011-11-25 22:25:39 内存使用 1.42 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN=10000000;
int Bus[101][501];
int Map[501][501];
int N,M;

void init()
{
	string line;
	scanf("%d %d\n",&M,&N);
	
	for (int i=1;i<=N;i++)
		for (int j=1;j<=N;j++)
			Map[i][j]=MAXN;
	
	for (int i=1;i<=M;i++)
	{
		Bus[i][0]=0;
		getline(cin,line);
		int tmp=0;
		int len=line.length();
		int top=0;
		while(top<len)
		{
			if(isdigit(line[top]))
			{
				tmp=tmp*10+line[top]-'0';
				top++;
				continue;
			}
			if(line[top]==' ')
			{
				Bus[i][0]++;
				Bus[i][Bus[i][0]]=tmp;
				tmp=0;
				top++;
				continue;
			}
		}
		if(tmp>0)
		{
			Bus[i][0]++;
			Bus[i][Bus[i][0]]=tmp;
		}
	}
	
	int t1,t2;
	for (int i=1;i<=M;i++)
	{
		for (int j=1;j<=Bus[i][0];j++)
		{
			for (int k=j;k<=Bus[i][0];k++)
			{
				t1=Bus[i][j];
				t2=Bus[i][k];
				Map[t1][t2]=0;
			}
		}
	}
}

void Floyd()
{
	int tmp;
	for (int k=1;k<=N;k++)
	{
		for (int i=1;i<=N;i++)
		{
			for (int j=1;j<=N;j++)
			{
				tmp=Map[i][k]+Map[k][j]+1;
				if(tmp<Map[i][j])
					Map[i][j]=tmp;
			}
		}
	}
	if(Map[1][N]==MAXN)
		printf("NO\n");
	else
		printf("%d\n",Map[1][N]);
}

int main()
{
	freopen("bustravel.in","r",stdin);
	freopen("bustravel.out","w",stdout);
	init();
	Floyd();
	return 0;
}