poj3159

During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the kids of flymouse’s class a large bag of candies and had flymouse distribute them. All the kids loved candies very much and often compared the numbers of candies they got with others. A kid A could had the idea that though it might be the case that another kid B was better than him in some aspect and therefore had a reason for deserving more candies than he did, he should never get a certain number of candies fewer than B did no matter how many candies he actually got, otherwise he would feel dissatisfied and go to the head-teacher to complain about flymouse’s biased distribution.

snoopy shared class with flymouse at that time. flymouse always compared the number of his candies with that of snoopy’s. He wanted to make the difference between the numbers as large as possible while keeping every kid satisfied. Now he had just got another bag of candies from the head-teacher, what was the largest difference he could make out of it?

Input
The input contains a single test cases. The test cases starts with a line with two integers N and M not exceeding 30 000 and 150 000 respectively. N is the number of kids in the class and the kids were numbered 1 through N. snoopy and flymouse were always numbered 1 and N. Then follow M lines each holding three integers A, B and c in order, meaning that kid A believed that kid B should never get over c candies more than he did.

Output
Output one line with only the largest difference desired. The difference is guaranteed to be finite.

Sample Input
2 2
1 2 5
2 1 4
Sample Output
5
Hint
32-bit signed integer type is capable of doing all arithmetic.
Source
POJ Monthly–2006.12.31, Sempr

/*
   solution: 求低N个孩子比第一个孩子多分多少糖果,其实就是求最短路径问题
             读入x y z时,相当与在节点xy之间添加一条权值为z的有向边
             直接套模板即可,此题中源点为1。

    note:    1.G.resize(n + 1),调整容器的长度大小,使其能容纳n个元素。
             2.自定义比较器,对<进行重载,使得在优先队列中能够使用结构体。
             3.同1有关。vector<vector<edgeNode> > G这样子比较快,vector对象的初始化也需要时间的。

    date:    2016/4/21
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>

using namespace std;
const int maxn = 30000 + 5;
const int  maxm = 150000 + 5;
const int INF = 100000000;

int dist[maxn], vis[maxn], n, m;

struct edgeNode {
    int node, val;  //结点以及通向该结点的一条有向边的权值
    edgeNode(int node = 0, int val = 0) : node(node), val(val) {}
    bool operator < (const edgeNode& rhs) const {
        return val > rhs.val;   //自定义的比较器,构建的是小顶堆,从小到大出列
    }
};
vector<vector<edgeNode> > G;    //用来存储图,用该方法比定义vector<edgeNode> G[maxn]快

int dijkstra() {
    memset(vis, 0, sizeof(vis));
    priority_queue<edgeNode> q;
    q.push(edgeNode(1, 0));
    dist[1] = 0;    //先初始化,并将开始节点1压入优先队列

    while(!q.empty()) {
        edgeNode u = q.top();   q.pop();    //取出优先队列的队头,并将其出列
        if(vis[u.node]) continue;   //如果已经访问过,就将其丢弃,继续出列下一个结点
        if(u.node == n)   break;    //说明第n个孩子已经求出来了,就可以直接跳出循环
        vis[u.node] = 1;

        for(int i = 0; i < G[u.node].size(); i++) { //寻找与其相邻的结点和路径
            edgeNode e = G[u.node][i];
            if(dist[e.node] > dist[u.node] + e.val) {
                dist[e.node] = dist[u.node] + e.val;
                q.push(e);
            }
        }
    }
    return dist[n];
}

int main() {
    //freopen("input.txt", "r", stdin);
    scanf("%d%d", &n, &m);
    int u, v, val;
    G.resize(n + 1);    //给vector初始化n+1个元素,不然调用“G[u].push_back(edgeNode(v, val));”时候会发生越界
    for(int i = 0; i < m; i++) {
        scanf("%d%d%d", &u, &v, &val);
        G[u].push_back(edgeNode(v, val));   //在调用此行时一定记得先resize();
    }   //读入数据

    for(int i = 1; i <= n; i++) dist[i] = INF;  //初始化
    int ans = dijkstra();
    printf("%d\n", ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值