disjkstra 算法
View Code
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int map[205][205]; void inint(int n) { int i,j; for(i = 0;i < n;i++) for(j = 0;j < n;j++) if(i != j) map[i][j] = 0x5fffffff; else map[i][j] = 0; }//初始化~ void Dijkstra(int s,int t,int n) { int vis[205] = {0}; int i,j,val[205],pre; vis[s] = 1; for(i = 0;i < n;i++) val[i] = map[s][i];//初始化(感觉跟prim一样的套路= =) pre = s; int min = 0x5fffffff; for(i = 1;i < n;i++)//循环N-1次 { min = 0x5fffffff; for(j = 0;j < n;j++) { if(!vis[j] && map[pre][j] != 0x5ffffff && val[j] > map[pre][j]+val[pre])//找出可以更新的值 val[j] = val[pre] + map[pre][j]; } for(j = 0;j < n;j++) if(min > val[j] && !vis[j])//找出最短的那一条~ min = val[j],pre = j; vis[pre] = 1; } if(val[t] == 0x5fffffff)//表明不可达,,, printf("-1\n"); else printf("%d\n",val[t]);//可达~ } int main() { int n,m,i,j,s,t,a,b,w; while(~scanf("%d %d",&m,&n)) { inint(m); for(i = 0;i < n;i++) { scanf("%d %d %d",&a,&b,&w); if(w < map[a][b]) map[a][b] = map[b][a] = w; } scanf("%d %d",&s,&t); Dijkstra(s,t,m); } return 0; }
floyd算法
View Code
1 #include <stdio.h> 2 #include <string.h> 3 #define max 10000*100+1 4 int map[205][205]; 5 void inint(int n) 6 { 7 int i,j; 8 for(i = 0;i < n;i++) 9 for(j = 0;j < n;j++) 10 if(i == j) 11 map[i][j] = 0; 12 else 13 map[i][j] = max; 14 } 15 int floyd(int n,int s,int t) 16 { 17 int val[205][205]; 18 int i,j,k; 19 for(i = 0;i < n;i++) 20 for(j = 0;j < n;j++) 21 val[i][j] = map[i][j]; 22 for(k = 0;k < n;k++)//循环n次 23 { 24 for(i = 0;i < n;i++) 25 { 26 for(j = 0;j < n;j++) 27 { 28 if(val[i][j] > val[i][k]+val[k][j]) 29 val[i][j] = val[i][k]+val[k][j]; 30 } 31 } 32 } 33 return val[s][t]; 34 } 35 int main() 36 { 37 int i,n,m,ans,a,b,s,w,t; 38 while(~scanf("%d %d",&n,&m)) 39 { 40 inint(n); 41 for(i = 0;i < m;i++) 42 { 43 scanf("%d %d %d",&a,&b,&w); 44 if(w < map[a][b]) 45 map[a][b] = map[b][a] = w; 46 } 47 scanf("%d %d",&s,&t); 48 ans = floyd(n,s,t); 49 if(ans >= max) 50 printf("-1\n"); 51 else 52 printf("%d\n",ans); 53 } 54 return 0; 55 }