1. 程式人生 > >【20171109】Luogu P3371 【模板】單源最短路徑--SPFA

【20171109】Luogu P3371 【模板】單源最短路徑--SPFA

else 輸入 所有 rom scanf node 時空 void edge

題目描述

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

輸入輸出格式

輸入格式:

第一行包含三個整數N、M、S,分別表示點的個數、有向邊的個數、出發點的編號。

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1:復制
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
輸出樣例#1:復制
0 2 4 3

說明

時空限制:1000ms,128M

數據規模:

對於20%的數據:N<=5,M<=15

對於40%的數據:N<=100,M<=10000

對於70%的數據:N<=1000,M<=100000

對於100%的數據:N<=10000,M<=500000

花了我一整個晚自習qwq,全賴我不爭氣的腦子,理解原理用了好久qwq

  1 //begin at 21:04
  2 #include<stdlib.h>
  3 #include <stdio.h>
  4 #define INF 2147483647
  5
#define maxn 10000 6 #define maxe 500000 7 typedef struct _edges 8 { 9 int w,t;//weight,tailNode 10 struct _edges *next; 11 }_edges; 12 int nv,ne,ibegin; 13 int minDis[maxn+1];//from [1] to [n] 14 _edges *edge[maxn+1];//from [1] to [n] 15 void readG() 16 { 17 scanf("%d%d%d",&nv,&ne,&ibegin);
18 int i,x,y,w; 19 _edges *p; 20 for(i=1;i<=nv;i++) 21 { 22 edge[i]=NULL; 23 minDis[i]=INF; 24 } 25 for(i=0;i<ne;i++) 26 { 27 scanf("%d%d%d",&x,&y,&w); 28 p=(_edges *)malloc(sizeof(_edges)); 29 p->w=w; 30 p->t=y; 31 p->next=edge[x]; 32 edge[x]=p; 33 } 34 return; 35 } 36 /*void tPrint(int input,char commmand) 37 { 38 if (commmand==‘w‘) 39 printf("%d out\n",input); 40 else if(commmand==‘r‘) 41 printf("%d in\n",input); 42 else if(commmand==‘a‘) 43 { 44 int i; 45 46 } 47 return ; 48 }*/ 49 void SPFA(int begin) 50 { 51 int queue[maxn+1]; 52 int isInQueue[maxn+1]; 53 int head,tail; 54 _edges *p; 55 int i,h; 56 57 for(i=1;i<=nv;i++) 58 isInQueue[i]=0; 59 head=0; 60 queue[0]=begin; 61 isInQueue[begin]=1; 62 tail=1; 63 minDis[begin]=0; 64 while(head!=tail) 65 { 66 h=queue[head%maxn]; 67 //tPrint(h,‘w‘);//========================== 68 p=edge[h]; 69 isInQueue[h]=0; 70 while(p!=NULL) 71 { 72 if(minDis[h] + p->w < minDis[p->t]) 73 //<==> if(dis[begin][h]+dis[h][t] < dis[begin][t]) 74 { 75 minDis[p->t]=minDis[h] + p->w; 76 if(isInQueue[p->t]==0) 77 { 78 isInQueue[p->t]=1; 79 queue[(tail++)%maxn]=p->t; 80 //tPrint(p->t,‘r‘);//========================== 81 } 82 } 83 p=p->next; 84 } 85 head++; 86 } 87 return ; 88 } 89 void print() 90 { 91 int i; 92 for(i=1;i<=nv;i++) 93 printf("%d ",minDis[i]); 94 printf("\n"); 95 } 96 int main() 97 { 98 readG(); 99 SPFA(ibegin); 100 print(); 101 return 0; 102 } 103 //end at 22:42 104 //I used lots of time to catch on the theory

【20171109】Luogu P3371 【模板】單源最短路徑--SPFA