记录编号 465561 评测结果 AAAAAAAAAA
题目名称 找最佳通路 最终得分 100
用户昵称 Gravatarユッキー 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2017-10-27 11:30:28 内存使用 0.34 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#define inf 999999999
#define maxv 1000
#define maxe 1000
const int lq=maxv+5;
#include <iostream>
using namespace std;
bool vis[maxv];
int dis[maxv];
int a[lq+1];
int u[maxe];
int v[maxe];
int w[maxe];
int first[maxv];
int next[maxv];
int n,m,s,t;
int head,tail;
int main()
{
    register int i,j;
    freopen("city.in","r",stdin);
    freopen("city.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(i=1;i<=n;i++)dis[i]=inf;
    dis[s]=0;
    a[1]=s;
    head=1,tail=2;
    vis[s]=1;
    for(i=1;i<=n;i++)first[i]=-1;
    for(i=1;i<=2*m;i+=2)
    {
        w[i]=1;
        scanf("%d%d",&u[i],&v[i]);
        w[i+1]=w[i];
        u[i+1]=v[i];
        v[i+1]=u[i];
        next[i]=first[u[i]];
        first[u[i]]=i;
        next[i+1]=first[u[i+1]];
        first[u[i+1]]=i+1;
    }
    int tmp;
    while(head<tail)
    {
        tmp=a[head];
        head=(head%lq)+1;
        vis[tmp]=0;
        for(i=first[tmp];i!=-1;i=next[i])
        {
            if(dis[v[i]]>dis[tmp]+w[i])
            {
                dis[v[i]]=dis[tmp]+w[i];
                //pre[v[i]]=tmp;
                if(!vis[v[i]])
                {
                    a[tail]=v[i];
                    tail=(tail%lq)+1;
                    vis[v[i]]=1;
                }
            }
        }
    }
    printf("%d",dis[t]+1);
    return 0;
}