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;
    }
  • 相关阅读:
    编写C#程序的IDE
    MacBook Pro装Win7后喇叭没有声音
    MacBook Pro装Win7后喇叭没有声音
    MacBook Pro装Win7后喇叭没有声音
    MacBook Pro装Win7后喇叭没有声音
    Linux从入门到精通系列之NFS
    Linux从入门到精通系列之NFS
    Linux从入门到精通系列之NFS
    Docker之docker设置系统的环境变量
    mq put 消息到远程队列
  • 原文地址:https://www.cnblogs.com/linliu/p/5455644.html
Copyright © 2011-2022 走看看