记录编号 161881 评测结果 AAAAAAAAAA
题目名称 [NOI 1997]最优乘车 最终得分 100
用户昵称 Gravatarraywzy 是否通过 通过
代码语言 C++ 运行时间 0.160 s
提交时间 2015-05-10 21:39:00 内存使用 15.69 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cmath>
#include<deque>
#include<iostream>
#include<vector>
#define INF 99999999
using namespace std;
class Node
{
public:
    int to,v;
};
int T,N,M,now;
vector<int> A[2005];
int adj[2005][2005];
bool tag[2005];
int dist[2005];
bool flag[2005];
void SPFA()
{
    dist[0]=0;int temp,i;
    deque<int> Q;flag[0]=1;
    Q.push_back(0);
    while(!Q.empty())
    {
        temp=Q.at(0);
        Q.pop_front();
        for(i=0;i<=now;i++)
        {
            if(adj[temp][i]!=-1&&dist[i]>dist[temp]+adj[temp][i])
            {
                dist[i]=dist[temp]+adj[temp][i];
                if(flag[i]==0)
                {
                    flag[i]=1;
                    Q.push_back(i);
                }
            }
        }
        flag[temp]=0;
    }
}
char a[2005];
int F[2005];

int fun()
{
    int j = 0;
    int cc = 0;
    int len = strlen(a);

    for(int i = 0;i <= len;i++)
    {
        if(isdigit(a[i]))
        {
            j *= 10;
            j += a[i]-'0';
        }
        else
        {
            F[cc++] = j;
            j= 0;
        }
    }
    return cc;

}


int main()
{
	freopen("bustravel.in","r",stdin);
	freopen("bustravel.out","w",stdout);
    int i,j,k;Node temp;
        memset(dist,63,sizeof(dist));
        memset(flag,0,sizeof(flag));
        memset(tag,0,sizeof(tag));
        memset(adj,-1,sizeof(adj));
        scanf("%d%d",&N,&M);
        now=M;
        getchar();

        for(i=1;i<=N;i++)
        {
            gets(a);
            int cc = fun();
            for(j=0;j<cc;j++)
            {
                if(tag[F[j]]==1)
                {
                   now++;
                   A[F[j]].push_back(now);
                   F[j]=now;
                }
                else
                    tag[F[j]]=1;
            }
            for(j=0;j<cc-1;j++)
                adj[F[j]][F[j+1]]=0;
        }
        for(i=1;i<=M;i++)
            A[i].push_back(i);
        for(i=1;i<=M;i++)
            for(j=0;j<A[i].size();j++)
                for(k=0;k<A[i].size();k++)
                {
                    if(adj[A[i][j]][A[i][k]]!=0)
                        adj[A[i][j]][A[i][k]]=1;
                }
        for(i=0;i<A[1].size();i++)
            adj[0][A[1][i]]=0;
        now++;
        for(i=0;i<A[M].size();i++)
            adj[A[M][i]][now]=0;
        SPFA();
        if(dist[now]>INF)
            printf("NO\n");
        else
            printf("%d\n",dist[now]);
        for(i=0;i<=now;i++)
            A[i].clear();
    return 0;
}