1. 程式人生 > 其它 >docker學習筆記(1)- 架構概述

docker學習筆記(1)- 架構概述

給定一個 nn 個點 mm 條邊的有向圖,圖中可能存在重邊和自環, 邊權可能為負數。

請你求出 11 號點到 nn 號點的最短距離,如果無法從 11 號點走到 nn 號點,則輸出 impossible

資料保證不存在負權迴路。

輸入格式

第一行包含整數 nn 和 mm。

接下來 mm 行每行包含三個整數 x,y,zx,y,z,表示存在一條從點 xx 到點 yy 的有向邊,邊長為 zz。

輸出格式

輸出一個整數,表示 11 號點到 nn 號點的最短距離。

如果路徑不存在,則輸出 impossible

資料範圍

1n,m1051≤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; }