POJ
来源:互联网 发布:php好学还是java好学 编辑:程序博客网 时间:2024/06/06 10:53
/*
POJ 3159
差分约束+SPFA
给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,
意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c 。
最后求n 比 1 最多多多少糖果。
【解题思路】
这是一题典型的差分约束题。不妨将糖果数当作距离,把相差的最大糖果数看成有向边AB的权值,
我们得到 dis[B]-dis[A]<=w(A,B)。看到这里,我们联想到求最短路时的松弛技术,
即if(dis[B]>dis[A]+w(A,B), dis[B]=dis[A]+w(A,B)。
即是满足题中的条件dis[B]-dis[A]<=w(A,B),由于要使dis[B] 最大,
所以这题可以转化为最短路来求。
这题如果用SPFA 算法的话,则需要注意不能用spfa+queue 来求,会TLE ,而是用 spfa + stack
2012-8-17
//SPFA的队列实现会超时,堆栈实现可以。
//没有负环回路判断,堆栈实现SPFA(有时候堆栈确实比较快)
POJ 3159
差分约束+SPFA
给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,
意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c 。
最后求n 比 1 最多多多少糖果。
【解题思路】
这是一题典型的差分约束题。不妨将糖果数当作距离,把相差的最大糖果数看成有向边AB的权值,
我们得到 dis[B]-dis[A]<=w(A,B)。看到这里,我们联想到求最短路时的松弛技术,
即if(dis[B]>dis[A]+w(A,B), dis[B]=dis[A]+w(A,B)。
即是满足题中的条件dis[B]-dis[A]<=w(A,B),由于要使dis[B] 最大,
所以这题可以转化为最短路来求。
这题如果用SPFA 算法的话,则需要注意不能用spfa+queue 来求,会TLE ,而是用 spfa + stack
2012-8-17
//SPFA的队列实现会超时,堆栈实现可以。
//没有负环回路判断,堆栈实现SPFA(有时候堆栈确实比较快)
//G++ 516ms
#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;const int MAXN=30010;const int MAXE=150010;const int INF=0x3f3f3f3f;int head[MAXN];//每个结点的头指针int vis[MAXN];//在队列标志int Q[MAXN];//堆栈int dist[MAXN];struct Edge{ int to; int v; int next;}edge[MAXE];int tol;void add(int a,int b,int v)//加边{ edge[tol].to=b; edge[tol].v=v; edge[tol].next=head[a]; head[a]=tol++;}void SPFA(int start,int n){ int top=0; for(int v=1;v<=n;v++)//初始化 { if(v==start) { Q[top++]=v; vis[v]=true; dist[v]=0; } else { vis[v]=false; dist[v]=INF; } } while(top!=0) { int u=Q[--top]; vis[u]=false; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(dist[v]>dist[u]+edge[i].v) { dist[v]=dist[u]+edge[i].v; if(!vis[v]) { vis[v]=true; Q[top++]=v; } } } }}int main(){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int n; int M; int a,b,c; while(scanf("%d%d",&n,&M)!=EOF) { tol=0;//加边计数,这个不要忘 memset(head,-1,sizeof(head)); while(M--) { scanf("%d%d%d",&a,&b,&c); //b-a<=c add(a,b,c); //大-小<=c ,有向边(小,大):c } SPFA(1,n); printf("%d\n",dist[n]); } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- 经典.net面试题目
- 全面详细的github中文教程
- HDU 6092 Rikka with Subset【多重背包+贪心】
- ROS-I开发流程
- 基于angularJs和Bootstrap的简易计算器
- POJ
- java.lang.UnsupportedClassVersionError异常
- 如何利用python把文章到数组中存储等待处理
- SPFA模板
- Service播放音乐
- HDU 2844 Coins[【经典题】【模板题】
- 初探PLC远程通讯技术
- 大数据框架之Spark框架
- 【正一专栏】八月是中国体面解决中印洞朗问题的最后机会