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;
}
原文地址:https://www.cnblogs.com/linliu/p/5455644.html