choose表示选择的算法~
1 #include <cstdio> 2 #include <cstring> 3 4 #define INF 2147483647 5 #define N 1000001 6 7 long long n,m,f,nxt[N],fst[N],v[N],e[N],cnt = 0,dis[N],queue[N]; 8 9 int t,w;bool inqueue[N] = {0}; //Dijkstra 10 11 bool book[1000001] = {0}; //spfa 12 13 void Add(int a,int b,int c){ 14 cnt++; 15 if(a == f)dis[b] = c; 16 e[cnt] = b; 17 nxt[cnt] = fst[a]; 18 fst[a] = cnt; 19 v[cnt] = c; 20 } 21 int main() 22 { 23 memset(fst,-1,sizeof(fst)); 24 memset(nxt,-1,sizeof(nxt)); 25 scanf("%lld %lld %lld",&n,&m,&f); 26 for(int i = 0;i <= n + 10;i++) 27 dis[i] = INF; 28 for(int i = 1;i <= m;i++){ 29 long long a,b,c; 30 scanf("%lld %lld %lld",&a,&b,&c); 31 Add(a,b,c); 32 } 33 34 int choose = 2; 35 36 if(choose == 1){ 37 //Dijkstra 38 dis[f] = 0; 39 book[f] = 0; 40 for(int i = 1;i <= n;i++){ 41 int Mn = INF,x; 42 for(int j = 1;j <= n;j++) 43 if(dis[j] < Mn && !book[j]) 44 Mn = dis[j],x = j; 45 book[x] = 1; 46 for(int k = fst[x];k != -1;k = nxt[k]) 47 if(v[k] + dis[x] < dis[e[k]]) 48 dis[e[k]] = v[k] + dis[x]; 49 } 50 } 51 if(choose == 2){ 52 //spfa 53 memset(inqueue,0,sizeof(inqueue)); 54 t = w = 1; 55 queue[1] = f; 56 inqueue[f] = 1; 57 dis[f] = 0; 58 while(t <= w){ 59 inqueue[queue[t]] = 0; 60 for(int j = fst[queue[t]];j != -1;j = nxt[j]){ 61 if(dis[queue[t]] + v[j] <= dis[e[j]]/*一定为"<="*/){ 62 dis[e[j]] = dis[queue[t]] + v[j]; 63 if(!inqueue[e[j]]){ 64 w++; 65 queue[w] = e[j]; 66 inqueue[e[j]] = 1; 67 } 68 } 69 } 70 t++; 71 } 72 } 73 74 for(int i = 1;i <= n;i++){ 75 //printf("%lld %c %lld : %lld\n",f,26,i,dis[i]); 76 printf("%d ",dis[i]); 77 } 78 79 return 0; 80 } 81 /* 82 ---data--- 83 84 4 5 1 85 1 4 9 86 2 4 6 87 1 2 5 88 4 3 8 89 1 3 7 90 ans: 91 0 5 7 9 92 93 4 6 1 94 1 2 2 95 2 3 2 96 2 4 1 97 1 3 5 98 3 4 3 99 1 4 4 100 ans: 101 0 2 4 3 102 103 6 9 1 104 1 2 1 105 1 3 12 106 2 3 9 107 2 4 3 108 3 5 5 109 4 3 4 110 4 5 13 111 4 6 15 112 5 6 4 113 ans: 114 0 1 8 4 13 17 115 */