算法訓練-最短路

用到SPFA,詳解請參考點擊打開鏈接,最短路的4種算法總結->點擊打開鏈接

題目:

算法訓練 最短路  
時間限制:1.0s   內存限制:256.0MB
      
問題描述

給定一個n個頂點,m條邊的有向圖(其中某些邊權可能爲負,但保證沒有負環)。請你計算從1號點到其他點的最短路(頂點從1到n編號)。

輸入格式

第一行兩個整數n, m。

接下來的m行,每行有三個整數u, v, l,表示u到v有一條長度爲l的邊。

輸出格式
共n-1行,第i行表示1號點到i+1號點的最短路。
樣例輸入
3 3
1 2 -1
2 3 -1
3 1 2
樣例輸出
-1
-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;
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章