标签:
#include <cstdio> #include <cstring> #define MAX 202 #define min(x,y) x<y?x:y #define inf 0x3f3f3f3f using namespace std; int map[MAX][MAX]; int main(){ int V,E,s,t; while(scanf("%d%d",&V,&E)!=EOF){ memset(map,inf,sizeof(map)); for(int i=0;i<E;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); map[x][y]=min(map[x][y],z); //可能有重边,所以需要处理 map[y][x]=map[x][y]; //无向图 } for(int i=0;i<V;i++){ //注意初始化!自己到自己是0! map[i][i]=0; } for(int k=0;k<V;k++){ for(int i=0;i<V;i++){ for(int j=0;j<V;j++){ map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } } } scanf("%d%d",&s,&t); if(map[s][t]==inf) puts("-1"); else printf("%d\n",map[s][t]); } return 0; }
Dijkstra用来计算单源最短路。起点可变
算法思想:
用dis存从起点到每个点的最小距离
整个算法的流程:
dij():
1.初始化vis和dis
2.循环至少n-1次(因为还有n-1个遍没有加进去)
(1)找到没有加入的点中最小的dis
(2)标记这个点t
(3)更新dis(j:1->n)
dis[j]=min(dis[t]+map[t][j]);
main()
初始化处理。
例题:
poj2387
<pre name="code" class="cpp"><pre name="code" class="cpp">#include <cstdio> #include <cstring> using namespace std; #define min(x,y) x<y?x:y #define MAXN 105 #define inf 0x3f3f3f3f int m,n; int map[MAXN][MAXN]; bool vis[MAXN]; int dis[MAXN]; void dij(int s){ //初始化 memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++){ dis[i]=map[s][i]; } dis[s]=0; vis[s]=true; //循环 //1.找最小的dis //2.标记 //3.更新 for(int j=0;j<=n;j++){ int t,mi=inf; for(int i=1;i<=n;i++){ if(!vis[i]&&mi>dis[i]){ t=i; mi=dis[i]; } } vis[t]=true; for(int i=1;i<=n;i++){ dis[i]=min(dis[i],dis[t]+map[t][i]); } } } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ if(n==0&&m==0) break; memset(map,inf,sizeof(map)); for(int i=0;i<m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); map[x][y]=min(map[x][y],z); map[y][x]=map[x][y]; } dij(1); printf("%d\n",dis[n]); } return 0; }
笔者是新手,容我下去自个看看,咱们下回分解^_^
最短路Floyd(hdu1874),dijstra(poj2387)
标签:
原文地址:http://blog.csdn.net/sinat_19628145/article/details/51347881