docker學習筆記(1)- 架構概述
阿新 • • 發佈:2022-03-09
給定一個 nn 個點 mm 條邊的有向圖,圖中可能存在重邊和自環, 邊權可能為負數。
請你求出 11 號點到 nn 號點的最短距離,如果無法從 11 號點走到 nn 號點,則輸出 impossible
。
資料保證不存在負權迴路。
輸入格式
第一行包含整數 nn 和 mm。
接下來 mm 行每行包含三個整數 x,y,zx,y,z,表示存在一條從點 xx 到點 yy 的有向邊,邊長為 zz。
輸出格式
輸出一個整數,表示 11 號點到 nn 號點的最短距離。
如果路徑不存在,則輸出 impossible
。
資料範圍
1≤n,m≤1051≤n,m≤105,
圖中涉及邊長絕對值均不超過 1000010000。
輸入樣例:
3 3 1 2 5 2 3 -3 1 3 4
輸出樣例:
2
其實我是喜歡這個演算法來著
總的思路就是找到所有應該更新的那個點,加入佇列,然後類似於bfs
#include<iostream> #include<queue> #include<cstring> using namespace std; int n,m; const int N=1e5+10; int h[N],e[N],ne[N],w[N],idx; int dist[N]; bool st[N]; void add(int a,int b,int c) { e[idx]=b; w[idx]=c; ne[idx]=h[a]; h[a]=idx++; } int spfa() { memset(dist,0x3f,sizeof(dist)); dist[1]=0; queue<int> q; q.push(1); while(q.size()) { auto t=q.front(); q.pop(); st[t]=false;//防止佇列裡有重複元素 for(int i=h[t];i!=-1;i=ne[i])//列舉t的所有出邊 { int j=e[i];if(dist[j]>dist[t]+w[i]) { dist[j]=dist[t]+w[i];//直接更新 if(!st[j]) { q.push(j); st[j]=true; } } } } if(dist[n]==0x3f3f3f3f) return -1; else return dist[n]; } int main(){ cin>>n>>m; memset(h,-1,sizeof(h)); for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; add(a,b,c); } int t=spfa(); if(t==-1) cout<<"impossible"<<endl; else cout<<t<<endl; return 0; }