洛谷 P3371 【模板】單源最短路徑

洛谷 P3371 【模板】單源最短路徑

題目描述

如題,給出一個有向圖,請輸出從某一點出發到所有點的最短路徑長度。

輸入輸出格式

輸入格式:

第一行包含三個整數N、M、S,分別表示點的個數、有向邊的個數、出發點的編號。
接下來M行每行包含三個整數Fi、Gi、Wi,分別表示第i條有向邊的出發點、目標點和長度。

輸出格式:

一行,包含N個用空格分隔的整數,其中第i個整數表示從點S出發到點i的最短路徑長度(若S=i則最短路徑長度爲0,若從點S無法到達點i,則最短路徑長度爲2147483647)

輸入輸出樣例

輸入樣例:

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

輸出樣例:

0 2 4 3

解題分析:

    Dijkstra

    用鏈接矩陣表示圖會超時,因此可採用鏈接表表示。另外,從一個頂點到另一個頂點可能有多條邊,只要取其中較小的邊即可。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
#define N 10005
#define INF 0x7fffffff
int n, m, s;
int d[N], visited[N] = {0};
struct node{
	int to;
	int v;
	void set(int to1, int v1){
		to = to1;
		v = v1;
	}
};
vector g[N];  // 鏈接表表示圖 
int get_i(){
	int ans = 0;
	char ch = getchar();
	while(ch<'0' || ch>'9')
		ch = getchar();
	while(ch>='0' && ch<='9'){
		ans = ans * 10 + ch - '0';
		ch = getchar();
	}
	return ans;
}

int main(){
	ios::sync_with_stdio(false);
	int i, j, from, to, v, k, min1, flag;
	node n1;
	n = get_i(), m = get_i(), s = get_i();
	
	for(i=0; i d[i]){
				min1 = d[i];
				k = i;
			}
		}
		if(k == -1)
			break;
		visited[k] = 1;
		for(i=0; i d[k] + g[k][i].v)
				d[g[k][i].to] = d[k] + g[k][i].v;
		}
	}
	for(i=1; i<=n; i++){
		cout<

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