首页 > 其他 > 详细

Heavy Transportation POJ - 1797

时间:2020-02-11 23:20:50      阅读:86      评论:0      收藏:0      [点我收藏+]
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>

using namespace std;
/*迪杰斯特拉算法为啥不能有负边
   因为你要保证从队列中取出来的最小的点x一定是该节点到原点的最短距离
   如果有负边,那么可能比他大的y点再加上负边导致x结点距离变得更小
   这道题利用了迪杰斯特拉的思想
*/
const int  INF=0x3f3f3f3f;
const int maxn=1000+10;
int dis[maxn],vis[maxn];
struct Node
{
    int v,value;
    Node()
    {

    }
    Node(int a,int b)
    {
        v=a;
        value=b;
    }
    bool operator<(const Node &d)const
    {
        return value<d.value;
    }
};
vector<Node>G[maxn];
void dji()
{
    priority_queue<Node> que;
    que.push(Node(1,INF));
    while(!que.empty())
    {
        Node node=que.top();
        que.pop();
        if(vis[node.v])
            continue;
        vis[node.v]=1;
        int v=node.v;
        dis[v]=node.value;
        for(int i=0; i<G[v].size(); i++)
        {
            Node node1=G[v][i];
            int v1=node1.v;
            dis[v1]=max(dis[v1],min(dis[v],G[v][i].value));

            que.push(Node(v1,dis[v1]));
        }
    }

}
int n,m;
int main()
{
    int t;
    scanf("%d",&t);
    int kase=0;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        int a,b,c;
        memset(dis,0,sizeof dis);
        memset(vis,0,sizeof vis);
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            G[a].push_back(Node(b,c));
            G[b].push_back(Node(a,c));
        }
        dji();
        printf("Scenario #%d:\n%d\n",++kase,dis[n]);

    }
    return 0;
}

 

Heavy Transportation POJ - 1797

原文:https://www.cnblogs.com/zhangzhenjun/p/12297227.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!