• 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
    ", d[1]);
        return 0;
    }
    
    
  • 相关阅读:
    Jenkins 搭建篇
    gitlab搭建使用
    apiDoc部署搭建
    传统切图
    Web前端性能优化的9大问题
    photoshop cc 智能切图
    ps切图
    前端ps切图,图文教程,详细。
    axios
    数组API
  • 原文地址:https://www.cnblogs.com/lif323/p/9892768.html
Copyright © 2020-2023  润新知