用到SPFA,詳解請參考點擊打開鏈接,最短路的4種算法總結->點擊打開鏈接
題目:
給定一個n個頂點,m條邊的有向圖(其中某些邊權可能爲負,但保證沒有負環)。請你計算從1號點到其他點的最短路(頂點從1到n編號)。
第一行兩個整數n, m。
接下來的m行,每行有三個整數u, v, l,表示u到v有一條長度爲l的邊。
1 2 -1
2 3 -1
3 1 2
-2
對於10%的數據,n = 2,m = 2。
對於30%的數據,n <= 5,m <= 10。
對於100%的數據,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保證從任意頂點都能到達其他所有頂點
==================================
在用SPFA算法時,注意每個題目數據量。
#include <algorithm>
#include <cstring>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include<cmath>
#define ll long long
#define N 100000+10
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int x,y,z;
bool v[20005];
int d[20005];
struct node
{
int y,z;
};
vector<node>e[20005];//vector
void spfa(int x){
memset(v,0,sizeof(v));//markable
d[x]=0;
queue<int>q;
q.push(x);
v[x]=1;
while(!q.empty()){
int st=q.front();
q.pop();
v[st]=0;
for(int i=0;i<e[st].size();i++){
if(d[st]+e[st][i].z<d[e[st][i].y]){
d[e[st][i].y]=d[st]+e[st][i].z;
if(!v[e[st][i].y]){
q.push(e[st][i].y);
v[e[st][i].y]=1;
}
}
}
}
}
int main(){
cin>>n>>m;
memset(d,INF,sizeof(d));
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
e[x].push_back((node){y,z});
//e[y].push_back((node){x,z});//save 無向圖
}
spfa(1);
for(int i=2;i<=n;i++){
cout<<d[i]<<endl;
}
return 0;
}