最短路径---dijkstra算法模板

dijkstra算法模板

http://acm.hdu.edu.cn/showproblem.php?pid=1874

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<stdlib.h>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<string>
10 #include<set>
11 #include<cctype>
12 #include<sstream>
13 #define mem(a) memset(a,0,sizeof(a))
14 #define LL long long
15 #define inf 0x3f3f3f3f
16 using namespace std;
17 const int N=1e3+5;
18 int mp[N][N],dis[N],mark[N];
19 int n,m;
20 int dijkstra(int s,int t)
21 {
22    for(int i=0;i<n;i++)
23    dis[i]=(i==s?0:mp[s][i]);
24    mark[s]=1;
25    //dis[s]=0;
26    int v;
27    for(int i=1;i<n;i++)
28    {
29       int mx=inf;
30       for(int j=0;j<n;j++)
31         if(dis[j]<mx&&!mark[j])
32           mx=dis[v=j]; //%%%
33       if(mx==inf) break;
34       mark[v]=1;
35       for(int j=0;j<n;j++)
36       {
37           if(!mark[j]&&(dis[j]>dis[v]+mp[v][j]))
38             dis[j]=dis[v]+mp[v][j];
39       }
40    }
41    if(dis[t]>=inf) return -1;
42    return dis[t];
43 }
44 int main()
45 {
46  while(~scanf("%d%d",&n,&m)&&(n+m))
47  {
48      for(int i=0;i<n;i++)
49      {
50        for(int j=0;j<n;j++)
51        {
52            if(i==j)mp[i][j]=0;
53            else mp[i][j]=inf;
54        }
55      }
56      mem(mark);
57      int l,r,x;
58      for(int i=1;i<=m;i++)
59      {
60          scanf("%d%d%d",&l,&r,&x);
61          if(mp[l][r]>x) mp[l][r]=mp[r][l]=x;
62      }
63      int s,t;
64      scanf("%d%d",&s,&t);
65 
66      printf("%d\n",dijkstra(s,t));
67  }
68  return 0;
69 }
View Code

 

posted @ 2019-01-25 14:01  XXrl  阅读(307)  评论(0编辑  收藏  举报