zoukankan      html  css  js  c++  java
  • Code Forces 26C Dijkstra?

    C. Dijkstra?
    time limit per test
    1 second
    memory limit per test
    64 megabytes
    input
    standard input
    output
    standard output

    You are given a weighted undirected graph. The vertices are enumerated from 1 to n. Your task is to find the shortest path between the vertex 1 and the vertex n.

    Input

    The first line contains two integers n and m (2 ≤ n ≤ 105, 0 ≤ m ≤ 105), where n is the number of vertices and m is the number of edges. Following m lines contain one edge each in form aibi and wi (1 ≤ ai, bi ≤ n, 1 ≤ wi ≤ 106), where ai, bi are edge endpoints and wi is the length of the edge.

    It is possible that the graph has loops and multiple edges between pair of vertices.

    Output

    Write the only integer -1 in case of no path. Write the shortest path in opposite case. If there are many solutions, print any of them.

    Examples
    input
    5 6
    1 2 2
    2 5 5
    2 3 4
    1 4 1
    4 3 3
    3 5 1
    
    output
    1 4 3 5 
    input
    5 6
    1 2 2
    2 5 5
    2 3 4
    1 4 1
    4 3 3
    3 5 1
    
    output
    1 4 3 5 
    
    
    在Dijstra上优化一下,就是用优先队列去找最小的值
    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <math.h>
    #include <queue>
    #include <stdio.h>
    #include <vector>
    
    using namespace std;
    const long long int INF=(long long int )1<<60;
    #define MAX 100000
    vector< pair<int,int> > a[MAX+5];
    struct Node
    {
        int pos;
        int value;
        Node(){};
        Node(int pos,int value)
        {
            this->pos=pos;
            this->value=value;
        }
        friend bool operator <(Node a,Node b)
        {
            return a.value>b.value;
        }
    };
    priority_queue<Node>q;
    int vis[MAX+5];
    long long int d[MAX+5];
    int pre[MAX+5];
    int n,m;
    void Dijstra()
    {
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
            d[i]=INF;
        pre[1]=-1;
        d[1]=0;
        q.push(Node(1,0));
        while(!q.empty())
        {
            Node term=q.top();
            q.pop();
            if(vis[term.pos]) continue;
            vis[term.pos]=1;
    
            for(int i=0;i<a[term.pos].size();i++)
            {
                int v=a[term.pos][i].first;
                int w=a[term.pos][i].second;
                if(!vis[v]&&d[term.pos]+w<d[v])
                {
                   d[v]=d[term.pos]+w;
                   pre[v]=term.pos;
                   q.push(Node(v,d[v]));
                }
            }
        }
    }
    void print(int x)
    {
        if(x==-1)
            return;
        print(pre[x]);
        if(x==n)
            cout<<x<<endl;
        else
            cout<<x<<" ";
    }
    int main()
    {
    
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            a[i].clear();
        int x,y,z;
    
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            a[x].push_back(make_pair(y,z));
            a[y].push_back(make_pair(x,z));
        }
        Dijstra();
        if(d[n]==INF)
            printf("-1
    ");
        else
            print(n);
        return 0;
    }




  • 相关阅读:
    python通过fake_useragent循环输出你需要的user-agent
    php来进行cc防护
    destoon7.0 蜘蛛访问统计插件
    Redis来限制用户某个时间段内访问的次数
    数据结构(十):复杂图-加权有向图,最短路径
    数据结构(十):复杂图-加权无向图,最小生成树
    数据结构(十):复杂图-有向图,拓扑图
    数据结构(十):图
    数据结构(九):并查集
    数据结构(八):优先队列-索引优先
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228720.html
Copyright © 2011-2022 走看看