洛谷 P3371 【模板】單源最短路徑
題目描述
如題,給出一個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入輸出格式
輸入格式:
第一行包含三個整數N、M、S,分別表示點的個數、有向邊的個數、出發點的編號。接下來M行每行包含三個整數Fi、Gi、Wi,分別表示第i條有向邊的出發點、目標點和長度。
輸出格式:
一行,包含N個用空格分隔的整數,其中第i個整數表示從點S出發到點i的最短路徑長度(若S=i則最短路徑長度爲0,若從點S無法到達點i,則最短路徑長度爲2147483647)輸入輸出樣例
輸入樣例:
4 6 11 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<