Descriptionios
Input算法
Outputapp
1 #include <iostream> 2 #include <string> 3 #include <queue> 4 #include <cstdio> 5 #include <cmath> 6 #include <cstring> 7 #include <algorithm> 8 #include <deque> 9 #include <vector> 10 #define LL long long 11 #define MAXI 2147483647 12 #define MAXL 9223372036854775807 13 #define dg(i) cout << "*" << i << endl; 14 using namespace std; 15 16 /** 17 *spfa算法:邻接矩阵+SLF策略 18 *顶点标号:1..n 19 *源点:1,目的点:n 20 */ 21 22 const int sz = 1005; //size--最大顶点数 23 const int inf = 0x3f3f3f3f; //最大值 24 int w[sz][sz]; //w[i][j]--边(i,j)的权值,若(i,j)不存在,w[i][j]为inf 25 int dis[sz]; //dis[i]--源点到顶点i的最短距离,初始化为inf 26 bool in[sz]; //in[i]--标记顶点i是否在队列中,在为true 27 int n, m; //n--顶点数,m--边数 28 29 int main() 30 { 31 while(scanf("%d %d", &m, &n) != EOF) 32 { 33 int u, v, d; 34 memset(dis, inf, sizeof(dis)); //0x3f3f3f3f是能够用memset初始化的 35 dis[1] = 0; // 36 memset(w, inf, sizeof(w)); 37 while(m--) 38 { 39 scanf("%d %d %d", &u, &v, &d); 40 w[u][v] = w[v][u] = min(d, w[u][v]); //为避免平行边,取min 41 } 42 memset(in, false, sizeof(in)); 43 deque<int> que; 44 que.push_front(1); //源点进队 45 in[1] = true; 46 while(!que.empty()) 47 { 48 int cur = que.front(); 49 que.pop_front(); 50 in[cur] = false; //撤销进队标志 51 for(int i = 1; i <= n; i++) //对与cur相邻的点都进行松弛计算 52 { 53 if(dis[cur] + w[cur][i] < dis[i]) 54 { 55 dis[i] = dis[cur] + w[cur][i]; //更新最短距离 56 if(!in[i]) //对于最短距离被更新的点,若不在队列则进队 57 { 58 //此处执行SLF策略,小的尽可能放前面。不采起这个策略而直接让i进队也能够 59 if(!que.empty() && dis[i] < dis[que.front()]) 60 que.push_front(i); 61 else que.push_back(i); 62 in[i] = true; 63 } 64 } 65 } 66 } 67 printf("%d\n", dis[n]); 68 } 69 return 0; 70 }