zoukankan      html  css  js  c++  java
  • C. The Two Routes---cf602C(Dij)

    http://codeforces.com/problemset/problem/602/C

    题目大意:  有n个城市 有m条铁路  如果两个城市没有铁路  那么一定有公路  

    求从1 到 n 用铁路和公路都到达的最短时间  如果有一种方式不能到  就直接输出-1

    分析:  肯定有一种方法是直接从1到四的  然后直接两个地杰斯特拉  输出最大值就行...

    #include<stdio.h>
    #include<math.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    #define INF 0xfffffff
    #define memset(a,b) memset(a,b,sizeof(a))
    using namespace std;
    
    #define N 500
    
    int G[N][N],vis[N],dis[N],maps[N][N],dis1[N];;
    int n,m;
    
    void Inn()
    {
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=n;j++)
            {
                G[i][j]=INF;
                maps[i][j]=INF;
            }
            dis[i]=INF;
            dis1[i]=INF;
            vis[i]=0;
        }
    }
    
    int Dij1(int s,int e)
    {
        dis[s]=0;
        for(int i=1;i<=n;i++)
        {
            int Min=INF,dist;
            for(int j=1;j<=n;j++)
            {
                if(Min>dis[j] && vis[j]==0)
                {
                    Min=dis[j];
                    dist=j;
                }
            }
            vis[dist]=1;
            for(int j=1;j<=n;j++)
            {
                dis[j]=min(dis[j],dis[dist]+G[dist][j]);
            }
        }
        return dis[e];
    }
    
    int Dij2(int s,int e)
    {
        memset(vis,0);
        dis1[s]=0;
        for(int i=1;i<=n;i++)
        {
            int Min=INF,dist;
            for(int j=1;j<=n;j++)
            {
                if(Min>dis1[j] && vis[j]==0)
                {
                    Min=dis1[j];
                    dist=j;
                }
            }
            vis[dist]=1;
            for(int j=1;j<=n;j++)
            {
                dis1[j]=min(dis1[j],dis1[dist]+maps[dist][j]);
            }
        }
        return dis1[e];
    }
    
    
    int main()
    {
    
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            Inn();
            int u,v;
            for(int i=0;i<m;i++)
            {
                scanf("%d %d",&u,&v);
                G[u][v]=G[v][u]=1;
            }
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(i==j)
                        continue;
                    if(G[i][j]==INF)
                        maps[i][j]=1;
                }
            }
            int k1=Dij1(1,n);
            int k2=Dij2(1,n);
            if(k1==INF || k2==INF)
                printf("-1
    ");
            else
            printf("%d
    ",max(k1,k2));
        }
        return 0;
    }
  • 相关阅读:
    forfiles
    windows 安装 keras
    windows上使用tensorboard
    python类定义与c#的一些区别
    iis https 客户端证书
    DevExpress历史安装文件、源码、注册破解下载
    AE开发,执行GP操作的时候的错误
    USB无线网卡和PCI-E无线网卡如何选择(转)
    .NET 对实现IPersistStream接口的对象进行保存和读取
    搜索
  • 原文地址:https://www.cnblogs.com/linliu/p/5455644.html
Copyright © 2011-2022 走看看