• Candies POJ


    题目链接:https://vjudge.net/problem/POJ-3159

    思路:

    能看出是差分约束的题,

    我们想假设一个人是 p(1),另一个人是p(2),他们之间糖果差为w,

    那么需要满足的是 :  p(2) - p(1) <= w,

    为了让p(1) 和 p(n)差距最大,我们可以取w,为了满足题目要求

    p2 - p1 <= w1, p3 - p2 <= w2,  p3 - p1 <= w3 ... ...  px - py <= wn(举例是任意的两个边要满足),

    我们可以建图了,用spfa的话,可以把松弛条件改了,

    if(dist[v] - dist[u] > w)  说明不合题目意思了,那么

    dist[v] = dist[u] + w;  去更新他。

    这里用队列优化spfa不可以,会超时,用栈可以,这里我认为是,栈类似于dfs,一个点的其他情况走到底,

    相比于队列类比bfs宽搜,每个点和边都要遍历到,用类似于dfs的方法可以减少其他宽搜的分支。

    而且,而且,而且,C++会超时。。。关了输入输出同步也会,c在大量数据输入时,c++还是比不了啊。。。


     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <queue>
     6 #include <stack>
     7 #include <string>
     8 #include <map>
     9 #include <cmath>
    10 #include <iomanip>
    11 using namespace std;
    12  
    13 typedef long long LL;
    14 #define inf 1e9
    15 #define rep(i,j,k) for(int i = (j); i <= (k); i++)
    16 #define rep__(i,j,k) for(int i = (j); i < (k); i++)
    17 #define per(i,j,k) for(int i = (j); i >= (k); i--)
    18 #define per__(i,j,k) for(int i = (j); i > (k); i--)
    19 
    20 const int N = 30010;
    21 int head[N];
    22 int vis[N];
    23 int dist[N];
    24 stack<int> sta;
    25 int cnt;
    26 int n,m;
    27 bool ok;
    28 
    29 struct Edge{
    30     int to;
    31     int w;
    32     int next;
    33 }e[150010];
    34 
    35 inline void add(int u,int v,int w){
    36     e[cnt].to = v;
    37     e[cnt].w = w;
    38     e[cnt].next = head[u];
    39     head[u] = cnt++;
    40 }
    41 
    42 void SPFA(){
    43 
    44     rep(i,2,n) dist[i] = inf;
    45     dist[1] = 0;
    46     sta.push(1);
    47 
    48     while(!sta.empty()){
    49         int u = sta.top();
    50         sta.pop();
    51         vis[u] = false;
    52 
    53         for(int o = head[u]; ~o; o = e[o].next){
    54             int v = e[o].to;
    55             int w = e[o].w;
    56 
    57             if(dist[v] - dist[u] > w){
    58                 dist[v] = dist[u] + w;
    59                 if(!vis[v]){
    60                     vis[v] = true;
    61                     sta.push(v);
    62                 }
    63             }
    64         }
    65     }
    66 
    67     printf("%d
    ",dist[n]);
    68     // cout << dist[n] << endl;
    69 }
    70 
    71 int main(){
    72 
    73     // ios::sync_with_stdio(false);
    74     // cin.tie(0);
    75 
    76     scanf("%d%d",&n,&m);
    77     // cin >> n >> m;
    78     rep(i,1,n) head[i] = -1;
    79     cnt = 0;
    80 
    81     int u,v,w;
    82     rep(i,1,m){
    83         // cin >> u >> v >> w;
    84         scanf("%d%d%d",&u,&v,&w);
    85         add(u,v,w);
    86     }
    87 
    88     SPFA();
    89 
    90     getchar(); getchar();
    91     return 0;
    92 }
  • 相关阅读:
    【Python】多态、协议和鸭子类型
    【Python】魔法方法之__call__,将对象当方法使用
    【Python】策略模式
    【Python】if 后怎么就可以跟对象?变量交换写法是语法糖吗?
    【Python 库】NumPy 超详细教程(3):ndarray 的内部机理及高级迭代
    【Python 库】NumPy 超详细教程(2):数据类型
    【Python 库】NumPy 超详细教程(1):NumPy 数组
    【杂谈】10 年三线小城 IT 开发的感悟
    【PostgreSQL】安装及中文显示
    【Python 库】轻量级 ORM 框架 peewee 用法详解之——增删改查
  • 原文地址:https://www.cnblogs.com/SSummerZzz/p/11373484.html
Copyright © 2020-2023  润新知