POJ-3159 Candies 最短路应用(差分约束)
题目链接:https://cn.vjudge.net/problem/POJ-3159
题意
给出一组不等式
求第一个变量和最后一个变量可能的最大差值
数据保证有解
思路
一个不等式a-b<=c,通过移项,实际上就是满足了a<=b+c
发现在整个约束系统中,a在下满足不等式的情况下求最大值,就是在求最短路
然而如果直接用BellmanFord(spfa)的话,还是会超时
这时得对Bellman做第二次优化,用stack代替queue
但是对于更多的图中,Dijsktra依然更优,所以没有必要太过考虑这个问题?
代码
Dijkstra
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=3e4+20, maxm=15e4+20, INF=0x3f3f3f3f;
typedef pair<int, int> Node;
struct Cmp{
    bool operator () (const Node &a, const Node &b){
        return a.first>b.first;
    }
};
struct Edge{
    int to, dis, next;
}edges[maxm+5];
int head[maxn+5], size=0;
void addEdge(int from, int to, int dis){
    edges[size]=Edge{to, dis, head[from]};
    head[from]=size++;
}
void init(void){
    memset(head, -1, sizeof(head));
    size=0;
}
int Bellman(int n){
    int dist[maxn+5], sta[maxn+5], top=0;//cnt[maxn+5];
    bool inq[maxn+5]={false};
    // queue<int> que;
    memset(dist, INF, sizeof(dist)); dist[1]=0;
    sta[top++]=1;
    while (top!=0){
        int from=sta[--top];
        inq[from]=false;
        for (int i=head[from]; i!=-1; i=edges[i].next){
            Edge &e=edges[i];
            int &to=e.to, &dis=e.dis;
            if (dist[to]<=dist[from]+dis) continue;
            dist[to]=dist[from]+dis;
            if (inq[to]) continue;
            sta[top++]=to; inq[to]=true;
        }
    }return dist[n];
}
int Dij(int n){
    int dist[maxn+5];
    priority_queue<Node, vector<Node>, Cmp> que;
    memset(dist, INF, sizeof(dist)); dist[1]=0;
    que.push(Node(dist[1], 1));
    while (que.size()){
        Node x=que.top(); que.pop();
        if (x.first!=dist[x.second]) continue;
        int &from=x.second;
        for (int i=head[from]; i!=-1; i=edges[i].next){
            Edge &e=edges[i];
            int &to=e.to, &dis=e.dis;
            if (dist[to]<=dist[from]+dis) continue;
            dist[to]=dist[from]+dis;
            que.push(Node(dist[to], to));
        }
    }return dist[n];
}
int main(void){
    int n, m, from, to, dis;
    init();
    scanf("%d%d", &n, &m);
    for (int i=0; i<m; i++){
        scanf("%d%d%d", &from, &to, &dis);
        addEdge(from, to, dis);
    }printf("%d\n", Dij(n));//Bellman(n));
    return 0;
}
| Time | Memory | Length | Lang | Submitted | 
|---|---|---|---|---|
| 532ms | 2568kB | 1960 | G++ | 2018-05-27 00:47:58 | 
BellmanFord
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=3e4+20, maxm=15e4+20, INF=0x3f3f3f3f;
struct Edge{
    int to, dis, next;
}edges[maxm+5];
int head[maxn+5], size=0;
void addEdge(int from, int to, int dis){
    edges[size]=Edge{to, dis, head[from]};
    head[from]=size++;
}
void init(void){
    memset(head, -1, sizeof(head));
    size=0;
}
int Bellman(int n){
    int dist[maxn+5], sta[maxn+5], top=0;//cnt[maxn+5];
    bool inq[maxn+5]={false};
    // queue<int> que;
    memset(dist, INF, sizeof(dist)); dist[1]=0;
    sta[top++]=1;
    while (top!=0){
        int from=sta[--top];
        inq[from]=false;
        for (int i=head[from]; i!=-1; i=edges[i].next){
            Edge &e=edges[i];
            int &to=e.to, &dis=e.dis;
            if (dist[to]<=dist[from]+dis) continue;
            dist[to]=dist[from]+dis;
            if (inq[to]) continue;
            sta[top++]=to; inq[to]=true;
        }
    }return dist[n];
}
int main(void){
    int n, m, from, to, dis;
    init();
    scanf("%d%d", &n, &m);
    for (int i=0; i<m; i++){
        scanf("%d%d%d", &from, &to, &dis);
        addEdge(from, to, dis);
    }printf("%d\n", Bellman(n));
    return 0;
}
| Time | Memory | Length | Lang | Submitted | 
|---|---|---|---|---|
| 485ms | 2108kB | 1220 | G++ | 2018-05-27 00:39:53 | 
POJ-3159 Candies 最短路应用(差分约束)的更多相关文章
- POJ 3159 Candies 解题报告(差分约束 Dijkstra+优先队列 SPFA+栈)
		原题地址:http://poj.org/problem?id=3159 题意大概是班长发糖果,班里面有不良风气,A希望B的糖果不比自己多C个.班长要满足小朋友的需求,而且要让自己的糖果比snoopy的 ... 
- POJ 3159 Candies(spfa、差分约束)
		Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ... 
- POJ 3159 Candies (图论,差分约束系统,最短路)
		POJ 3159 Candies (图论,差分约束系统,最短路) Description During the kindergarten days, flymouse was the monitor ... 
- POJ 3159 Candies(差分约束,最短路)
		Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 20067 Accepted: 5293 Descrip ... 
- Candies POJ - 3159 (最短路+差分约束)
		During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher b ... 
- POJ 3159 Candies(差分约束+最短路)题解
		题意:给a b c要求,b拿的比a拿的多但是不超过c,问你所有人最多差多少 思路:在最短路专题应该能看出来是差分约束,条件是b - a <= c,也就是满足b <= a + c,和spfa ... 
- POJ 3159 Candies(SPFA+栈)差分约束
		题目链接:http://poj.org/problem?id=3159 题意:给出m给 x 与y的关系.当中y的糖数不能比x的多c个.即y-x <= c 最后求fly[n]最多能比so[1] ... 
- POJ 3159 Candies(差分约束+spfa+链式前向星)
		题目链接:http://poj.org/problem?id=3159 题目大意:给n个人派糖果,给出m组数据,每组数据包含A,B,C三个数,意思是A的糖果数比B少的个数不多于C,即B的糖果数 - A ... 
- 图论--差分约束--POJ 3159 Candies
		Language:Default Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 43021 Accep ... 
- POJ 3159 Candies 差分约束dij
		分析:设每个人的糖果数量是a[i] 最终就是求a[n]-a[1]的最大值 然后给出m个关系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c 所以对于这种情况,按照u ... 
随机推荐
- Unity碰撞和触发的区别
			碰撞的必要条件: 2个都有Collider,且至少有一个刚体.带刚体的身上会检测OnCollision事件,stay就是2个一直在碰着. 触发的必要条件: 至少有一个碰撞器勾选了IsTrigger,至 ... 
- Unity 默认进入的scenes
			1,如果有多个场景,那么第一个场景要放在最上边,(其他的也要加) 2,如果不添加,那么Unity会把当前打开的场景添加进来. 3,切换场景的代码 using UnityEngine.SceneMana ... 
- Linux入门学习
			什么是Linux? Linux是一个操作系统软件.和Windows不同的是,Linux是一套开放源代码程序的.并可以自由传播的类Unix操作系统,它是一个支持多用户.多任务.多线程和多CPU的操作系统 ... 
- 粘包解决高端_Server
			from socket import * #导入套接字模块的所有命令import subprocess #导入subprocess模块,用于执行命令行import struct #导入struck模块 ... 
- React中的setState(obj)
			1.setState(obj) 只能浅merge obj,对于复杂对象结构的不行 比如: this.state = { data:{ idx:1 } } this.setState( ... 
- Lvs+heartbeat高可用高性能web站点的搭建
			这是我们公司在实际的生产环境当中使用的一套东西,希望对大家有所帮助(实际的公网ip,我已经做了相应的修改): 说明:每台服务器需要有两块网卡:eth0连接内网的交换机,用私网ip,实现服务器间内部访问 ... 
- 紫书 习题7-8 UVa 12107 (IDA*)
			参考了这哥们的博客 https://blog.csdn.net/hyqsblog/article/details/46980287 (1)atoi可以char数组转int, 头文件 cstdlib ... 
- 前端和后台对接时对sign加密方法
			前端和后台对接时对sign加密方法 /*后台php对接进行sign标签加密 1 获取向后台请求的数据data(key/value方式),可以是个对象(obj),也可以是数组(arr); 2 将数据的k ... 
- 2015 Multi-University Training Contest 6 hdu 5361 In Touch
			In Touch Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ... 
- nodejs是一个平台,是平台
			node.js是用javascript来写服务器代码的平台 
