51-node-1649齊頭並進(最短路)
阿新 • • 發佈:2018-05-25
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齊頭並進(最短路)