http://acm.hdu.edu.cn/showproblem.php?pid=2544
自己写的最短路第一题,dijstra算法
#include<stdio.h> #include<iostream> using namespace std; int dp[105][105]; int dijstra(int beg,int end) { bool flag[105]; int path[105]; int i,min; for(i=beg;i<=end;i++) { path[i]=INT_MAX; flag[i]=true; } path[beg]=0; flag[beg]=false; while(beg!=end) { for(i=1;i<=end;i++) { if(dp[beg][i]&&path[i]>path[beg]+dp[beg][i]) path[i]=path[beg]+dp[beg][i]; } min=INT_MAX; for(i=1;i<=end;i++) { if(flag[i]&&path[i]<min) { beg=i; min=path[i]; } } flag[beg]=false; } return path[end]; } int main() { int n,m,a,b,c; while(~scanf("%d%d",&n,&m),n+m) { memset(dp,0,sizeof(dp)); while(m--) { scanf("%d%d%d",&a,&b,&c); if(!dp[a][b]) dp[a][b]=dp[b][a]=c; else dp[a][b]=dp[b][a]=c<dp[a][b]?c:dp[a][b]; } printf("%d\n",dijstra(1,n)); } return 0; }
第一道的SPFA,关于SPFA下面这个博客讲的很清楚,orz呀
http://blog.sina.com.cn/s/blog_4f3b79d00100ao4z.html
#include<stdio.h> #include<vector> #include<queue> #define MAX 105 #define INF 1<<28 using namespace std; struct node { int v,w; }; vector<node> g[MAX]; queue<int> q; int n,m; int spfa(int beg,int end) { int i,path[MAX]; bool flag[MAX]; for(i=1;i<=n;i++) { flag[i]=0; path[i]=INF; } 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]; } int main() { int a,b,c,i; while(~scanf("%d%d",&n,&m),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); } printf("%d\n",spfa(1,n)); } return 0; }