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;
    }




  • 相关阅读:
    线程
    sqlite3数据库操作
    20、android解决方案(转载)
    19、android面试题整理(自己给自己充充电吧)
    18、ESC/POS指令集在android设备上使用实例(通过socket)
    17、android设备如何防止屏幕休眠(转载)
    16、根据年月日获取周几 以及整理的日期常用的工具类
    15、android 用toast实现简单的进度显示
    14、到底改如何区分android的平板、电视、手机
    13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228720.html
Copyright © 2011-2022 走看看