POJ 3159 Candies 解题报告(差分约束 Dijkstra+优先队列 SPFA+栈)
原题地址:http://poj.org/problem?id=3159
题意大概是班长发糖果,班里面有不良风气,A希望B的糖果不比自己多C个。班长要满足小朋友的需求,而且要让自己的糖果比snoopy的尽量多。

比如现在ABCD四个小朋友,B的糖果不能超过A的5个,如果A的史努比,D是班长,那么班长最多比史努比多7个糖果,而不是5+4+1=9个。
因为如果是9个,就不满足D-A<=(D-C)+(C-A)<=7的条件。
不懂的可以翻一下算法导论,上面有差分约束的定义和证明,总之这是一个求最短路的问题==。
其实为了理解题意,我也花了很久时间SF-_-。
知道是求最短路之后,做法就有很多了,BUT数据量较大,很多做法会超时。这里推荐两个算法,一个是优先队列优化的Dijkstra算法,AC代码如下(579MS):
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
struct CNode
{
int k;
int w;
bool operator<(const CNode& cmp) const
{
return w>cmp.w;
}
}; priority_queue<CNode> pq;
bool vis[];
int first[],vv[],ww[],nxt[];
const int inf=~(<<);
CNode p,q; int main()
{
// freopen("in.txt","r",stdin); memset(d,,sizeof(d)); int e=;
int n,m,u,v,w;
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
nxt[e]=first[u],vv[e]=v,ww[e]=w,first[u]=e++;
} p.k=;
p.w=;
pq.push(p);
while(!pq.empty())
{
p=pq.top();
pq.pop(); if(vis[p.k])
continue;
vis[p.k]=true; if(p.k==n)
break;
for(int e=first[p.k];e;e=nxt[e]) if(!vis[vv[e]])
{
q.k=vv[e];
q.w=p.w+ww[e];
pq.push(q);
}
}
printf("%d\n",p.w);
}
另一个是栈优化的SPFA算法(532MS):
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std; int d[];
int stack[]; bool vis[];
int first[],vv[],ww[],nxt[];
const int inf=~(<<); int main()
{
// freopen("in.txt","r",stdin); memset(d,,sizeof(d)); int e=;
int n,m,u,v,w;
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
nxt[e]=first[u],vv[e]=v,ww[e]=w,first[u]=e++;
}
memset(d,0x7f,sizeof(d)); int top=;
stack[++top]=;
vis[]=true;
d[]=; while(top)
{
int a=stack[top--];
vis[a]=false; for(int e=first[a];e;e=nxt[e]) if(d[vv[e]]>ww[e]+d[a])
{
d[vv[e]]=ww[e]+d[a];
if(!vis[vv[e]])
{
stack[++top]=vv[e];
vis[vv[e]]=true;
}
}
}
printf("%d\n",d[n]);
}
POJ 3159 Candies 解题报告(差分约束 Dijkstra+优先队列 SPFA+栈)的更多相关文章
- Candies POJ - 3159 (最短路+差分约束)
During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher b ...
- POJ 3159 【朴素的差分约束】
好吧终于知道什么是“高大上”的差分约束了.嗷嗷 题意: 小朋友们分糖果,某个小朋友不想另外一个小朋友分到的糖果数比自己多N块以上. 求编号为N的小朋友最多比编号为1的小朋友多分多少块糖果. 思路: 差 ...
- poj 1364 King(线性差分约束+超级源点+spfa判负环)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14791 Accepted: 5226 Description ...
- POJ 3159 Candies(差分约束,最短路)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 20067 Accepted: 5293 Descrip ...
- POJ 3159 Candies (图论,差分约束系统,最短路)
POJ 3159 Candies (图论,差分约束系统,最短路) Description During the kindergarten days, flymouse was the monitor ...
- (简单) POJ 3159 Candies,Dijkstra+差分约束。
Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ...
- POJ 3159 Candies 【差分约束+Dijkstra】
<题目链接> 题目大意: 给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c .最后求n 比 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 ...
随机推荐
- FlatBuffers
1 What is FlatBuffers. FlatBuffers is a serialization library for games and other memory constrained ...
- 【转载】TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
- 【原创】开机出现grub rescue,修复办法
出现这种问题 一般在于进行了磁盘分区(GHOST备份时也会造成)导致grub引导文件找不到.我们只要让它找到引导文件就好了. 此时屏幕上提示grub resume> 我们先输入set看下现在g ...
- aspx页面状态管理(查询字符串Request与Application)
1,Request:可以方便的将信息从一个页面传递到另一个页面,通过url传递,不安全,数据量小,只能通过http-get提交的才可以 2,Application对象:()本质上是Hash表)所有访问 ...
- JavaScript 判断用户输入的邮箱及手机格式是否正确
JavaScript判断用户输入的邮箱格式是否正确.判断用户输入的手机号格式是否正确,下面有个不错的示例,感兴趣的朋友可以参考下. 复制代码代码如下: /* * 功能:判断用户输入的邮箱格式是否正确 ...
- 挑战Python-20160826
给你一字典a,如a={1:1,2:2,3:3},输出字典a的key,以','链接,如‘1,2,3'.
- building hadoop2.4.1 on centos7[在centos7上面构建hadoop2.4.1]
本文介绍在centos7上面通过hadoop2.4.1源码构建hadoop distribution 版本,即hadoop的运行版本. 为何要自己building,而不用Apache的distribu ...
- sencha touch json store
js: Ext.define('MyApp.store.MyJsonStore', { extend: 'Ext.data.Store', requires: [ 'MyApp.model.Perso ...
- Git Commit Template 提交模板
多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...
- asp.net 文件复制或删除用相对路径,File.Copy中用相对路径,巧用相对路径复制文件
再复制文件 File.Copy(Server.MapPath("被复制的文件相对路径"), Server.MapPath("目的位置相对路径"), true); ...