码迷,mamicode.com
首页 > 其他好文 > 详细

最短路基础

时间:2015-07-21 09:06:09      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

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

Dijkstra邻接链表(适用于边少,顶点多):

技术分享
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #define INF 0xfffffff
 6 #define N 1100
 7 #include<vector>
 8 using namespace std;
 9 
10 struct node
11 {
12     int e,w;
13 };
14 
15 int n,m,vis[N],dist[N];
16 vector<node>G[N];
17 
18 void Dij(int Start,int End)
19 {
20     int i,j,Min,index;
21     vis[Start]=1;
22     dist[Start]=0;
23 
24     node p;
25     for(i=1; i<=n; i++)
26     {
27         Min=INF;
28         index=Start;
29         for(j=1; j<=n; j++)
30             if(vis[j]==0&&Min>dist[j])
31                 Min=dist[j],index=j;
32         vis[index]=1;
33         int len=G[index].size();
34         for(j=0; j<len; j++)
35         {
36             p=G[index][j];
37             if(vis[p.e]==0&&dist[p.e]>dist[index]+p.w)
38                 dist[p.e]=dist[index]+p.w;
39         }
40     }
41 
42 }
43 
44 int main()
45 {
46     int i,a,b,c;
47     node p;
48     while(scanf("%d%d",&n,&m),m+n)
49     {
50         for(i=0; i<N; i++)
51         {
52             dist[i]=INF;
53             vis[i]=0;
54             G[i].clear();
55         }
56         for(i=0; i<m; i++)
57         {
58             scanf("%d%d%d",&a,&b,&c);
59             p.e=b;
60             p.w=c;
61             G[a].push_back(p);
62             p.e=a;
63             G[b].push_back(p);
64         }
65         Dij(1,n);
66         printf("%d\n",dist[n]);
67     }
68     return 0;
69 }
View Code

Dijkstra链接矩阵(适用于变多,顶点少):

技术分享
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
#define INF 0xfffffff
#define N 1100
int n,m,maps[N][N],dist[N],vis[N];//dist[i]表示从起点到i的最短距离;
void Dij(int Star ,int End)
{
    int i,j,index,Min;
    dist[Star]=0;
    vis[Star]=1;
    index=Star;
    for(i=1;i<=n;i++)
    {
        Min=INF;
        for(j=1;j<=n;j++)
        {
            if(Min>dist[j]&&vis[j]==0)
            {
                Min=dist[j];
                index=j;
            }
        }
        vis[index]=1;
        for(j=1;j<=n;j++)
        {
            if(vis[j]==0&&dist[j]>dist[index]+maps[index][j])
                dist[j]=dist[index]+maps[index][j];
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m),m+n)
    {
        int i,j,a,b,c;
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)
            {
                maps[i][j]=INF;
            }
            vis[i]=0;
            dist[i]=INF;
        }//初始化;
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            maps[a][b]=min(maps[a][b],c);
            maps[b][a]=maps[a][b];
        }
        Dij(1,n);
        printf("%d\n",dist[n]);
    }
    return 0;
}
View Code

Floyd:

技术分享
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define INF 0xfffffff
#define N 1100
using namespace std;
int n,m;
int maps[N][N];
void Floyd()
{
    int i,j,k;
    for(k=1; k<=n; k++)
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
                maps[i][j]=min(maps[i][j],maps[i][k]+maps[k][j]);
        }
}
void Init()
{
    int i,j;
    for(i=0; i<=n; i++)
        for(j=0; j<=n; j++)
            if(i==j)
                maps[i][j]=0;
            else
                maps[i][j]=INF;
}
int main()
{
    int i,a,b,c;
    while(scanf("%d%d",&n,&m),m+n)
    {
        Init();
        for(i=0; i<m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            maps[a][b]=maps[b][a]=c;
        }
        Floyd();
        printf("%d\n",maps[1][n]);
    }
    return 0;
}
View Code

 

最短路基础

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4663315.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!