HDU2544最短路模板,

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define INF 0xfffffff
#define N 1010

int maps[N][N], dist[N];//distance保存表示从起点到i点的距离 maps保存图
bool visit[N];//标记这个店是否被参观过
int point, side;//点,边
void Init();
int Dij(int Star, int End);
int main()
{
    while(cin >> point >> side, point + side)
    {
        Init();//Initial
        int pa, pb, i, t;
        for(i=0; i<side; i++)
        {
            cin >>pa>>pb>>t;
            maps[pa][pb]=min(maps[pa][pb], t);//因为也许反向走路的长度不同
            maps[pb][pa]=maps[pa][pb];
        }
        int answer=Dij(1, point);
        cout << answer << endl;
    }
    return 0;
}
void Init()
{
    for(int i=0; i<=point; i++)
    {
        visit[i]=false;
        dist[i]=INF;
        for(int j=0; j<=i; j++)//其实不明白这里为什么这样写,即便是我自己写的
            maps[i][j]=maps[j][i]=INF;//真的很神奇,其实这就等同于for(int j=0; j<=point; j++) maps[i][j]=INF;

    }
}
int Dij(int Star, int End)
{
    dist[Star]=0;
    for(int i=1; i<=point; i++)
    {
        int index, Min;
        index=0, Min=INF;//index 代表与i距点最近的点的下标
        for(int j=1; j<=point; j++)
        {
            if(!visit[j]&&Min>dist[j])
                Min=dist[j], index=j;
        }//代表找到了距1点最近的一个点           这是一个二维矩阵
        visit[index]=true;
        for(int j=1; j<=point; j++)
        {
            if(!visit[j]&&dist[j]>dist[index]+maps[index][j])
                dist[j]=dist[index]+maps[index][j];
        }
    }
    return dist[End];
}

  

连接表代码
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 0xfffffff
#define maxn 1002
struct node
{
    int e, w;
};
vector<node> G[maxn];
int dist[maxn];//表示从起点到第i点的距离
bool vis[maxn];//判断这个点是否被参观过
int m, n;//边数 m   顶点数 n

void Init()
{
    memset(vis, false, sizeof(vis));

    for(int i=0; i<=n; i++)
    {
        dist[i] = INF;
        G[i].clear();
    }
}

int Dij(int Star,int End)//起点 --- 终点
{
    dist[Star] = 0;
    for(int i=1; i<=n; i++)
    {
        int index = 0, Min = INF;
        for(int j=1; j<=n; j++)
        {
            if( !vis[j] && Min > dist[j] )//找出没有被参观过,并且距离起点最近的点
                Min = dist[j], index = j;
        }
        vis[index] = true;
        int len = G[index].size();
        for(int j=0; j<len; j++)//更新所有未曾到达的点距离,使之成为最近的点
        {
            node P;
            P = G[index][j];

            if( !vis[P.e] && dist[P.e] >  dist[index] + P.w )
            {
                dist[P.e] =  dist[index] + P.w;
            }
        }
    }
    return dist[End];
}



int main()
{
    node P;
    while(cin >> n >> m, m + n)
    {
        Init();
        int a, b , c;

        for(int i=0; i<m; i++)
        {
            cin >> a >> b >> c;
            P.e = b, P.w = c;
            G[a].push_back(P);
            P.e = a;
            G[b].push_back(P);
        }

        int ans = Dij(1,n);
        cout << ans << endl;
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/wazqWAZQ1/p/4656217.html