这题作为模板题,解法好多...
最近周围的人都在搞图论阿,感觉我好辣鸡,只会跟风学习。
暂时只有SPFA的
SPFA (邻接表版。也可以写成临接矩阵存图,但题目可能给出平行边的,所以要注意找最小的边储存,还要注意判断一个点是否多次进入队列)老实说觉得SPFA好像只是被队列优化过的搜索一样的..
1 #include <stdio.h> 2 #include <algorithm> 3 #include <iostream> 4 #include <string.h> 5 #include <utility> 6 #include <vector> 7 #include <queue> 8 #define MAXX 10010 9 using namespace std; 10 11 const int N = 250; 12 const int INF = 0x3f3f3f3f; 13 14 15 typedef struct sion 16 { 17 int dis; 18 int nxp; 19 }sion; 20 21 int dic[N]; 22 bool vis[N]; 23 vector<sion>li[N]; 24 25 26 int spfa(int &s, int &t) 27 { 28 queue<int>q; 29 q.push(s); 30 vis[s] = 1; 31 dic[s] = 0; 32 while(!q.empty()) 33 { 34 int pre = q.front(); 35 q.pop(); 36 for(int i = 0; i < li[pre].size(); i++) 37 { 38 // cout << dic[li[pre][i].nxp] << "~"; 39 if(dic[li[pre][i].nxp] > dic[pre] + li[pre][i].dis) 40 { 41 dic[li[pre][i].nxp] = dic[pre] + li[pre][i].dis; 42 q.push(li[pre][i].nxp); 43 // cout << dic[li[pre][i].nxp] << "!"; 44 } 45 } 46 47 } 48 return dic[t]; 49 } 50 51 void init() 52 { 53 memset(vis,false,sizeof(vis)); 54 memset(dic,INF,sizeof(dic)); 55 for(int i = 0; i < N; i++) 56 li[i].clear(); 57 return ; 58 } 59 60 int main() 61 { 62 int n, m; 63 int s, t; 64 while(cin >> n >> m) 65 { 66 init(); 67 sion a; 68 int x; 69 for(int i = 0; i < m; i++) 70 { 71 scanf("%d%d%d",&x, &a.nxp, &a.dis); 72 li[x].push_back(a); 73 int temp = a.nxp; 74 a.nxp = x; 75 li[temp].push_back(a); 76 } 77 scanf("%d%d", &s, &t); 78 int y = spfa(s, t); 79 if(y >= INF) 80 { 81 printf("-1\n"); 82 } 83 else printf("%d\n", y); 84 } 85 }
时间: 2024-11-05 12:31:52