http://poj.org/problem?id=3159

题意:

flymouse是幼稚园班上的班长,一天老师给小朋友们买了一堆的糖果,由flymouse来分发,在班上,
flymouse和snoopy是死对头,两人势如水火,不能相容,因此fly希望自己分得的糖果数尽量多于
snoopy,而对于其他小朋友而言,则只希望自己得到的糖果不少于班上某某其他人就行了。

比如A小朋友强烈希望自己的糖果数不能少于B小朋友m个,即B- A<=m,A,B分别为
A、B小朋友的分得的糖果数。这样给出若干组这样的条件,要使fly最后分得的糖果数s1和snoopy
最后分得的糖果数s2差别取到最大!即s2-s1取最大.

思路:求源点1到n的最短距离。Dijstra+邻接表

不过直接用dij会超时。可以用优先队列优化一下。不过运算符重载那里被卡了好久。悲惨的教训啊。

 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; const int INF = 0x3f3f3f3f;
const int maxv = ;
const int maxe = ;
struct node
{
int v,w,next;
}edge[maxe];//邻接表 struct node1
{
int v,c;
bool operator < (const node1 &t) const
{
return c > t.c;//距离从小到大排序
}
};//存每个节点和它到源点的最短距离。 int n,m,cnt;
int p[maxe];
int dis[maxv];
int vis[maxv];
void add(int u, int v, int w)
{
cnt++;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = p[u];
p[u] = cnt;
} void dijstra(int s)
{
priority_queue<struct node1> que;
for(int i = ; i <= n; i++)
dis[i] = INF;
memset(vis,,sizeof(vis)); dis[s] = ;
que.push((struct node1){s,dis[s]});
for(int i = ; i < n; i++)
{
while(!que.empty() && vis[que.top().v])
que.pop();
if(que.empty()) break; node1 tmp = que.top();
que.pop();
vis[tmp.v] = ;
for(int j = p[tmp.v]; j; j = edge[j].next)
{
if((dis[edge[j].v] > dis[tmp.v] + edge[j].w) && !vis[edge[j].v])
{
dis[edge[j].v] = dis[tmp.v] + edge[j].w;
que.push((struct node1){edge[j].v,dis[edge[j].v]});
}
}
}
} int main()
{
while(~scanf("%d %d",&n,&m))
{
int u,v,w;
memset(p,,sizeof(p));
cnt = ;
for(int i = ; i < m; i++)
{
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
}
dijstra();
printf("%d\n",dis[n]); }
return ;
}

看discuss里面也可以用SPFA+stack,可能用stack效率高一点吧。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std; const int INF = 0x3f3f3f3f;
const int maxv = ;
const int maxe = ; struct node
{
int v,w;
int next;
}edge[maxe];
int n,m,cnt;
int p[maxe];
int dis[maxv],instack[maxv];
void add(int u, int v, int w)
{
cnt++;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = p[u];
p[u] = cnt;
} void SPFA(int s)
{
stack<int>st;
for(int i = ; i <= n; i++)
dis[i] = INF;
memset(instack,,sizeof(instack));
dis[s] = ;
st.push(s);
instack[s] = ;
while(!st.empty())
{
int u = st.top();
st.pop();
instack[u] = ; for(int i = p[u]; i; i = edge[i].next)
{
if(dis[edge[i].v] > dis[u] + edge[i].w)
{
dis[edge[i].v] = dis[u] + edge[i].w;
if(!instack[edge[i].v])
{
st.push(edge[i].v);
instack[edge[i].v] = ;
}
}
}
}
} int main()
{
while(~scanf("%d %d",&n,&m))
{
cnt = ;
memset(p,,sizeof(p));
int u,v,w;
for(int i = ; i < m; i++)
{
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
}
SPFA();
printf("%d\n",dis[n]);
}
return ;
}

Candies(差分约束)的更多相关文章

  1. poj3159 Candies(差分约束,dij+heap)

    poj3159 Candies 这题实质为裸的差分约束. 先看最短路模型:若d[v] >= d[u] + w, 则连边u->v,之后就变成了d[v] <= d[u] + w , 即d ...

  2. POJ-3159.Candies.(差分约束 + Spfa)

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 40407   Accepted: 11367 Descri ...

  3. 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 ...

  4. [poj 3159]Candies[差分约束详解][朴素的考虑法]

    题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...

  5. [poj3159]Candies(差分约束+链式前向星dijkstra模板)

    题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 解题关键:差分约束系统转化为最短路,B-A>=C,建有向边即可,与 ...

  6. poj 3159 Candies 差分约束

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 22177   Accepted: 5936 Descrip ...

  7. poj3159 Candies(差分约束)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Candies Time Limit: 1500MS   Memory Limit ...

  8. POJ3159 Candies —— 差分约束 spfa

    题目链接:http://poj.org/problem?id=3159 Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submiss ...

  9. POJ 3159 Candies(差分约束,最短路)

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 20067   Accepted: 5293 Descrip ...

随机推荐

  1. C#将DataTable导出Execl、Word、Xml

        /// <summary>     /// 将DT转换为Execl的方法     /// </summary>     /// <param name=" ...

  2. PHP 给前面或者后面添加0补位

    相信大家一定遇到这样的问题,因为PHP是弱类型的,所以进行排序的时候,有时候很胃疼 所以这里就需要将位数进行统一后进行处理 一般都是将末尾添加0进行补位 方法1 :  str_pad — 使用另一个字 ...

  3. (转)教你如何使用php session

    PHP session用法其实很简单它可以把用户提交的数据以全局变量形式保存在一个session中并且会生成一个唯一的session_id,这样就是为了多了不会产生混乱了,并且session中同一浏览 ...

  4. asp.net各种获取客户端ip方法

    Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真 ...

  5. MongoDB的索引

    一.索引详讲 索引是什么,索引就好比一本书的目录,当我们想找某一章节的时候,通过书籍的目录可以很快的找到,所以适当的加入索引可以提高我们查询的数据的速度. 准备工作,向MongoDB中插入20000条 ...

  6. ORACLE如何停止一个JOB

    ORACLE如何停止一个JOB1 相关表.视图2 问题描述为同事解决一个因为网络连接情况不佳时,执行一个超长时间的SQL插入操作.既然网络状况不好,就选择了使用一次性使用JOB来完成该插入操作.在JO ...

  7. 《深入.NET平台和C#编程》内部测试题-笔试试卷

    1.以下关于序列化和反序列化的描述错误的是( C). a.序列化是将对象的状态存储到特定存储介质中的过程 b.二进制格式化器的Serialize()和Deserialize()方法可以用来实现序列化和 ...

  8. JS中关于clientWidth offsetWidth srollWidth等的含义

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  9. 子网/ip/子网掩码

    IP地址由网络地址和主机地址组成 而现在IP由“子网掩码”通过子网网络地 址细分出 A,B,C类更小的网络.这种方式 实际上就是将原来的A类,B类,C类等分类 中的的主机地址部分用作子网地址,可以 将 ...

  10. 前端开发web组件之旅(一)-- 定义与加载组件

    /* 前言 */ 自上而下的 职责和API应用层框架层框架浏览器 一 组件定义与调用 1.增加一个组件 tabview.css ------------------------------------ ...