• CF 602C The Two Routes(dij+邻接矩阵)


    ( ̄▽ ̄)"

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    #include<vector>
    #include<stack>
    #include<map>
    using namespace std;
    typedef long long ll;
    
    const int INF=10e8;
    const int MAXN=410;
    
    int k,minn;
    int lc[MAXN],c1[MAXN][MAXN],c2[MAXN][MAXN];
    bool vis[MAXN];
    
    int dij(int n,int c[][MAXN])
    {
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
            lc[i]=c[1][i];
        vis[1]=1;
    
        for(int j=1;j<=n;j++)
        {
            k=-1,minn=INF;
            for(int i=1;i<=n;i++)
            {
                if(!vis[i]&&minn>lc[i])
                {
                    minn=lc[i];
                    k=i;
                }
            }
            if(k==-1) break;
            vis[k]=1;
            for(int i=1;i<=n;i++)
                if(!vis[i]&&lc[i]>lc[k]+c[k][i])
                    lc[i]=lc[k]+c[k][i];
        }
        if(lc[n]==INF)
            lc[n]=-1;
        return lc[n];
    }
    
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j)
                {
                    c1[i][j]=c1[j][i]=0;
                }
                else
                {
                    c1[i][j]=c1[j][i]=INF;
                    c2[i][j]=c2[j][i]=INF;
                }
            }
        }
    
        for(int i=1;i<=m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            c1[u][v]=c1[v][u]=1;
            if((u==1&&v==n)||(u==n&&v==1))
                flag=1;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(c1[i][j]==0||c1[i][j]==INF)
                    c2[i][j]=c2[j][i]=1;
            }
        }
        if(m==n*(n-1)/2)
            printf("-1
    ");
        else
        {
            if(flag==1)
                printf("%d
    ",dij(n,c2));
            else if(flag==0)
                printf("%d
    ",dij(n,c1));
        }
        return 0;
    }
  • 相关阅读:
    反射
    IDEA配置数据库
    配置idea的maven镜像为aliyun
    蓝桥---芯片测试(思维)
    汉诺塔(思维、DP思想)
    立方数(质因子、优化)
    碎碎念(DP)
    牛牛战队的比赛地(三分)
    子段乘积(尺取、逆元)
    子段异或(位运算)
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5216549.html
Copyright © 2020-2023  润新知