1 条题解

  • 1
    @ 2020-07-09 01:15:05
    #include <bits/stdc++.h>
    #define MAXN 510
    #define MAX 0x3f3f3f3f
    using namespace std;
    int ori=1,node;
    //ori 起点   node 节点数 
    int a[5005];        
    //存输入 
    int dis[MAXN],g[MAXN][MAXN];
    bool vis[MAXN]; 
    void init()
    {
        memset(vis,0,sizeof(vis));
        memset(dis,0,sizeof(dis));
        vis[ori]=1;
        for(int i=1;i<=node;++i)        dis[i] = (i == ori ? 0 : g[ori][i]);
    }
    void Dijkstra()
    {
        int k;
        init();
        for(int i=1;i<=node-2;++i)
        {
            int m=MAX;
            for(int j=1;j<=node;++j)
            {
                if(dis[j]<m && vis[j]==0)
                {m=dis[j];  k=j;}
            }
            if(m==MAX)      break;
            vis[k]=1;
            for(int j=1;j<=node;++j)
                if(dis[k]+g[k][j]<dis[j])
                    dis[j]=dis[k]+g[k][j];  
        }
        return ;
    }
    int main()
    {
        int edge;
        scanf("%d%d",&edge,&node);
        for(int i=1;i<=node;++i)
            for(int j=1;j<=node;++j)
                g[i][j]=MAX;
        for(int i=1;i<=edge;++i)
        {
            memset(a,0,sizeof(a));
            int n=0;                //计数器 
            char c=1;
            while(c!=-1 && c!='\n')
            {
                scanf("%d",&a[ ++n ]);
                c=-1;
                scanf("%c",&c);
            }
            for(int j=1;j<n;++j)
                for(int k=j+1;k<=n;++k)
                    g[ a[j] ][ a[k] ]=1;
        }
        Dijkstra();
        if(dis[node]>=MAX) printf("NO");
        else printf("%d",dis[node]-1);
        return 0;
    }
    

    很神奇的是,VOJ上过了,洛谷却没过。。。

  • 1

信息

难度
8
分类
(无)
标签
递交数
91
已通过
13
通过率
14%
被复制
1
上传者