1. 程式人生 > >51-node-1649齊頭並進(最短路)

51-node-1649齊頭並進(最短路)

else Go oid != return string OS AC amp

題意:中文題,沒啥坑點;

解題思路:這道題一開始以為要跑兩個最短路,後來發現不用,因為如果給定了鐵路的線路,那麽,公路一定是n個節點無向圖的補圖,所以,鐵路和公路之間一定有一個是可以直接從1到n的,我們只需要對剩下的那個跑最短路就行了,還有一個,就是,如果這個鐵路線路沒有補圖,那麽公路就沒路走,輸出-1;我使用迪傑斯特拉寫的,我感覺bfs代碼更簡潔來著;

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 200050
#define inf 0x3f3f3f3f
using namespace std;
struct Edge
{
    int next;
    int to;
    int w;
}edge[maxn];
int head[maxn];
int dist[maxn];
int cnt;
int Map[505][505];
struct node
{
    int num;
    int dist;
    node(int _num=0,int _dist=0):num(_num),dist(_dist){}
    friend bool operator<(node a,node b)
    {
        return a.dist>b.dist;
    }
};
void add(int u,int v,int w)
{
    edge[cnt].next=head[u];
    edge[cnt].to=v;
    edge[cnt].w=w;
    head[u]=cnt++;
}
void dij(int x)
{
    memset(dist,inf,sizeof(dist));
    priority_queue<node>que;
    dist[x]=0;
    que.push(node(x,0));
    while(!que.empty())
    {
        node u=que.top();
        que.pop();
        int now=u.num;
        for(int i=head[now];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to;
            if(dist[v]>dist[now]+edge[i].w)
            {
                dist[v]=dist[now]+edge[i].w;
                que.push(node(v,dist[v]));
            }
        }
    }
}
int main()
{
    int n,m;
    int flag=0;
    int x[maxn],y[maxn];
    cin>>n>>m;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=m;i++)
    {
        cin>>x[i]>>y[i];
        Map[x[i]][y[i]]=Map[y[i]][x[i]]=1;
        if(x[i]==1&&y[i]==n||x[i]==n&&y[i]==1)
            flag=1;
    }
    if(flag==0)
    {
        for(int i=1;i<=m;i++)
        add(x[i],y[i],1),add(y[i],x[i],1);
    }
    else
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j)
                    continue;
                if(Map[i][j]==0)
                {
                    add(i,j,1);
                    add(j,i,1);
                }
            }
        }
    }
    dij(1);
    if(dist[n]==inf)
        cout<<"-1\n";
    else
    cout<<dist[n]<<endl;
    return 0;
}

  

51-node-1649齊頭並進(最短路)