最短路

目前只学了Dijkstra

这个贴讲的很详细:

http://www.wutianqi.com/?p=1890

 


HDOJ 2544 最短路

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

裸的Dij

 1 #include<cstdio>
 2 #define MAXN 105
 3 #define INF 0x3f3f3f3f
 4 #define MIN(a,b) (a<b?a:b)
 5 int n,m,a,b,x;
 6 int map[MAXN][MAXN];
 7 int vis[MAXN];
 8 int dist[MAXN];
 9 void init()
10 {
11     for(int i=1;i<=n;i++)
12     {
13         for(int j=1;j<=n;j++)
14         {
15             if(i==j) map[i][j]=0;
16             else map[i][j]=INF;
17         }
18     }
19 }
20 void Dijkstra()
21 {
22     for(int i=1;i<=n;i++)
23     {
24         dist[i]=map[1][i];
25         vis[i]=0;
26     }
27     vis[1]=1;
28     int tmp,u=1;
29     for(int i=1;i<=n;i++)
30     {
31         tmp=INF;
32         for(int j=1;j<=n;j++)
33         {
34             if(!vis[j]&&dist[j]<tmp)
35             {
36                 tmp=dist[j];
37                 u=j;
38             }
39         }
40         vis[u]=1;
41         if(u==n) return;//找到这个点就可以return了,不用找完
42         for(int j=1;j<=n;j++)
43         {
44             if(!vis[j]&&map[u][j]<INF)
45             {
46                 dist[j]=MIN(dist[j],dist[u]+map[u][j]);
47             }
48         }
49     }
50 }
51 int main()
52 {
53     while(scanf("%d%d",&n,&m)!=EOF)
54     {
55         if(n==0&&m==0) break;
56         init();
57         for(int i=0;i<m;i++)
58         {
59             scanf("%d%d%d",&a,&b,&x);
60             if(map[a][b]>x)
61             {
62                 map[a][b]=x;
63                 map[b][a]=x;
64             }
65         }
66         Dijkstra();
67         printf("%d\n",dist[n]);
68     }
69     return 0;
70 }
View Code

HDOJ 1874 畅通工程续

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

水水更健康...

 1 #include<cstdio>
 2 #define MAXN 210
 3 #define INF 0x3f3f3f3f
 4 #define MIN(a,b) (a<b?a:b)
 5 int map[MAXN][MAXN];
 6 int dist[MAXN];
 7 int is_in[MAXN];
 8 int n,m,s,e,a,b,x;
 9 void init()
10 {
11     for(int i=0;i<n;i++)
12     {
13         for(int j=0;j<n;j++)
14         {
15             if(i==j) map[i][j]=0;
16             else map[i][j]=INF;
17         }
18         dist[i]=INF;
19         is_in[i]=0;
20     }
21 }
22 int Dijkstra()
23 {
24     for(int i=0;i<n;i++)
25     {
26         if(map[s][i]<INF) dist[i]=map[s][i];
27     }
28     is_in[s]=1;
29     int tmp,u=s;
30     for(int i=0;i<n;i++)
31     {
32         tmp=INF;
33         //zhaodao zuixiao dianhao
34         for(int j=0;j<n;j++)
35         {
36             if(!is_in[j]&&dist[j]<tmp)
37             {
38                 tmp=dist[j];
39                 u=j;
40             }
41         }
42         is_in[u]=1;
43         if(u==e) return 1;
44         for(int j=0;j<n;j++)
45         {
46             if(!is_in[j]&&map[u][j]<INF)
47             {
48                 dist[j]=MIN(dist[j],dist[u]+map[u][j]);
49             }
50         }
51     }
52     return 0;
53 }
54 int main()
55 {
56     while(scanf("%d%d",&n,&m)!=EOF)
57     {
58         init();
59         for(int i=0;i<m;i++)
60         {
61             scanf("%d%d%d",&a,&b,&x);
62             if(x<map[a][b])
63             {
64                 map[a][b]=x;
65                 map[b][a]=x;
66             }
67         }
68         scanf("%d%d",&s,&e);
69         Dijkstra();
70         if(dist[e]<INF) printf("%d\n", dist[e]);
71         else printf("-1\n");
72     }
73     return 0;
74 }
View Code

持续更新中...

 

posted @ 2014-08-15 16:56  Grubbyskyer  阅读(141)  评论(0编辑  收藏  举报