POJ_2387_最短路径

题目大意

输入T, N;分别代表无向图边的数目和节点的数目;
接下来T行,每行三个数u,v, w 代表u, v,之间存在一条边权重为w;
要求:求出节点N 到节点1的最短距离;

题解

主要使用了dijistra算法,使用邻接表的方法存图。
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXT = 2005 * 2;
const int MAXN = 1005;
const int INF = 0x7fffffff;
int T, N;
struct Edge
{
    int nt;
    int v;
    int w;
};
Edge edge[MAXT];
int head[MAXN];
int cnt = 0;
void addEdge(int u, int v, int w)
{
    edge[cnt].v = v;
    edge[cnt].w = w;
    edge[cnt].nt = head[u];
    head[u] = cnt;
    ++cnt;
}
int d[MAXN];
int vis[MAXN];
void init()
{
    for(int i = 1; i <= N; ++i)
    {
        d[i] = INF;
        vis[i] = 0;
    }
}
struct P
{
    int id;
    int d;
};
struct cmp
{
    bool operator()(const P& a, const P& b)
    {
        return a.d > b.d;
    }
};
void dij()
{
    init();
    d[N] = 0;
    vis[N] = 1;
    priority_queue<P, vector<P>, cmp> q;
    P tmp, now;
    now.d = 0;
    now.id = N;
    q.push(now);
    while(!q.empty())
    {
        now = q.top();
        q.pop();
        int id = now.id;
        int dis = now.d;
        if(d[id] < dis) continue;
        vis[id] = 1;
        for(int i = head[id]; i != -1; i = edge[i].nt)
        {
            int v = edge[i].v;
            if(vis[v] == 1)continue;
            int w = edge[i].w;
            if(dis + w < d[v])
            {
                d[v] = dis + w;
                tmp.d = d[v];
                tmp.id = v;
                q.push(tmp);
            }
        }
    }
}
int main()
{

    scanf("%d%d",&T, &N);
    int u, v, w;
    memset(head, -1, sizeof(head));
    cnt = 0;
    for(int i = 0; i < T; ++i)
    {
        scanf("%d%d%d", &u, &v, &w);
        addEdge(u, v, w);
        addEdge(v, u, w);
    }
    dij();
    printf("%d\n", d[1]);
    return 0;
}

如有错误,恳请指正

猜你喜欢

转载自www.cnblogs.com/lif323/p/9892768.html
今日推荐