• POJ 3159


    在幼儿园的时候,Flymouse是班上的班长。有时班主任会给班上的孩子们带来一大袋糖果,让他们分发。所有的孩子都非常喜欢糖果,经常比较他们和别人买的糖果的数量。一个孩子A可以有这样的想法,尽管可能是另一个孩子B在某些方面比他好,因此他有理由比他应得更多的糖果,但无论他实际得到多少糖果,他都不应该得到比B少的一定数量的糖果,否则他会感到不满意。 Flymouse总是把他的糖果和snoopy的比较,他想在让每个孩子都满意的同时,尽可能使自己的糖比snoopy的多。现在他又从班主任那里得到了一袋糖果,他最多能比snoopy多拿到几颗糖?

    Input

    输入包含单个测试用例。测试用例以两个整数n和m开始,分别不超过30000和150000。n是班上的孩子数,孩子数从1到n。snoopy和flymouse总是分别是1和n。然后按照m行,每一行依次包含三个整数a、b和c,这意味着孩子a相信孩子b永远不会比他得到的多于c颗糖果。

    Output

    只输出一行可能达到的最大差异。保证差异是有限的。

    Sample Input

    2 2
    1 2 5
    2 1 4

    Sample Output

    5

    Hint

    32位有符号整数类型可以执行所有算术运算。

    题目大意:

    输入n和m,表示班上有n个孩子和m种关系,接下来输入m行,每行包括a b c 表示孩子 a 最多只能比孩子 b 少 c 颗糖果,输出孩子1和孩子n糖果数差异的最大值。

    解题思路:

    理清题意后发现是最短路模板题,链式前向星存图,跑堆优化dijksta即可AC,注意这道题卡SPFA,SPFA TLE了一发。

    Code:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <iomanip>
    #include <sstream>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #define lowbit(x) x & (-x)
    
    using namespace std;
    
    typedef long long ll;
    typedef pair<int, int> pii;
    
    const int mod = 1e9 + 7;
    const int inf = 0x3f3f3f3f;
    const int N = 1e6 + 50;
    const int M = 1e4 + 50;
    
    int h[N], ne[N], e[N], w[N], idx;
    int dis[N];
    bool vis[N];
    int n, m;
    
    void add(int a, int b, ll c)
    {
    	e[idx] = b;
    	w[idx] = c;
    	ne[idx] = h[a];
    	h[a] = idx++;
    }
    
    void dijkstra()
    {
    	memset(dis, 0x3f, sizeof dis);
    	dis[1] = 0;
    
    	priority_queue<pii, vector<pii >, greater<pii> > q;
    	q.push({0, 1});
    	
    	while (!q.empty())
    	{
    		int u = q.top().second;
    		q.pop();
    
    		if (vis[u]) continue;
    		vis[u] = true;
    
    		for (int i = h[u]; ~i; i = ne[i])
    		{
    			int j = e[i];
    			if (dis[u] + w[i] < dis[j])
    			{
    				dis[j] = dis[u] + w[i];
    				q.push({dis[j], j});
    			}
    		}
    	}
    }
    
    int main()
    {
    	scanf("%d%d", &n, &m);
    
    	memset(h, -1, sizeof h);
    	while (m --)
    	{
    		int a, b, c;
    		scanf("%d%d%d", &a, &b, &c);
    		add(a, b, c);
    	}
    
    	dijkstra();
    
    	printf("%d
    ", dis[n]);
    
    	return 0;
    }
    
  • 相关阅读:
    .Net创建Windows服务完成批量导出功能(错误速查)
    WIN7 64位对Excel操作异常
    登陆优化的经验
    SQL 使用触发器常见错误
    CSS样式表优化
    JavaScript getMonth() 方法
    MVC架构 -- 初学试水<选课管理系统>
    触摸不到的天空
    嵌套 QQ、微博 通讯工具到HTML中
    CSS 实现样式下拉菜单
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294123.html
Copyright © 2020-2023  润新知