http://acm.hdu.edu.cn/showproblem.php?pid=1874
第一次floyd算法,求最短路
#include<stdio.h> #include<iostream> using namespace std; const int M=1<<29; int map[201][201]; int n,m; void floyd() { int k,i,j; for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) map[i][j] = min(map[i][k] + map[k][j], map[i][j]); } int main() { int a,b,c,p,q,i,j; while(~scanf("%d%d",&n,&m)) { for(i=0;i<n;i++) for(j=0;j<n;j++) map[i][j]=i==j?0:M; while(m--) { scanf("%d%d%d",&a,&b,&c); if(c<map[a][b]) map[a][b]=map[b][a]=c; } scanf("%d%d",&p,&q); floyd(); printf("%d\n",(map[p][q]<M)?map[p][q]:-1); } return 0; }
再来个dijstra的
#include<stdio.h> #include<string.h> #define MAX 1<<28 int map[205][205]; int n,m; int dijstra(int beg,int end) { bool flag[205]; int path[205]; int i,min,x; for(i=0;i<n;i++) { path[i]=MAX; flag[i]=true; } path[beg]=0; flag[beg]=false; x=n-1; while(x--) { for(i=0;i<n;i++) { if(map[beg][i]&&path[i]>path[beg]+map[beg][i]) path[i]=path[beg]+map[beg][i]; } min=MAX; for(i=0;i<n;i++) { if(flag[i]&&min>path[i]) { min=path[i]; beg=i; } } flag[beg]=false; } path[end]=path[end]<MAX?path[end]:-1; return path[end]; } int main() { int a,b,c,beg,end; while(~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); while(m--) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]) map[a][b]=map[b][a]=c<map[a][b]?c:map[a][b]; else map[a][b]=map[b][a]=c; } scanf("%d%d",&beg,&end); printf("%d\n",dijstra(beg,end)); } return 0; }
再贴上一个SPFA的,刚开始学习尽量每道题用多种算法都写一变,这样记得更牢
#include<stdio.h> #include<vector> #include<queue> #define MAX 205 #define INF 1<<28 using namespace std; int n,m; struct node { int v,w; }; vector<node> g[MAX]; queue<int> q; int spfa(int beg,int end) { int i,path[MAX]; bool flag[MAX]; for(i=0;i<n;i++) { path[i]=INF; flag[i]=0; } path[beg]=0; flag[beg]=1; q.push(beg); while(!q.empty()) { int k=q.front(); q.pop(); flag[k]=0; for(i=0;i<g[k].size();i++) { int v=g[k][i].v; int w=g[k][i].w; if(path[v]>path[k]+w) { path[v]=path[k]+w; if(!flag[v]) { flag[v]=1; q.push(v); } } } } return path[end]<INF?path[end]:-1; } int main() { int a,b,c,i; int beg,end; while(~scanf("%d%d",&n,&m)) { for(i=0;i<n;i++) g[i].clear(); while(m--) { scanf("%d%d%d",&a,&b,&c); node t; t.v=a; t.w=c; g[b].push_back(t); t.v=b; g[a].push_back(t); } scanf("%d%d",&beg,&end); printf("%d\n",spfa(beg,end)); } return 0; }