POJ 3159 【朴素的差分约束】
2015-10-02 10:02
295 查看
好吧终于知道什么是“高大上”的差分约束了。嗷嗷
题意:
小朋友们分糖果,某个小朋友不想另外一个小朋友分到的糖果数比自己多N块以上。
求编号为N的小朋友最多比编号为1的小朋友多分多少块糖果。
思路:
差分约束,用最短路做。
这题用SPFA.
查分约束的学习感谢博客:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html
注意:
POJ也是拼,第一次碰到永std的queue会超时,需要手写一个人工栈的情况...
代码:
题意:
小朋友们分糖果,某个小朋友不想另外一个小朋友分到的糖果数比自己多N块以上。
求编号为N的小朋友最多比编号为1的小朋友多分多少块糖果。
思路:
差分约束,用最短路做。
这题用SPFA.
查分约束的学习感谢博客:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html
注意:
POJ也是拼,第一次碰到永std的queue会超时,需要手写一个人工栈的情况...
代码:
#include<stdio.h> #include<algorithm> #include<queue> #include<string.h> using namespace std; const int inf=0x3f3f3f3f; struct edge { int id,w; edge *next; }; edge edges[150010]; edge *adj[30005]; bool vis[30005]; int ednum; int n,m; int dis[30005]; void SPFA() { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { dis[i]=inf; } dis[1]=0; int q[30005]; int top=0; q[++top]=1; vis[1]=1; while(top) { int tmp=q[top--]; vis[tmp]=0; for(edge *p=adj[tmp];p;p=p->next) { if(dis[p->id]>dis[tmp]+p->w) { dis[p->id]=dis[tmp]+p->w; if(!vis[p->id]) { q[++top]=p->id; vis[p->id]=1; } } } } } inline void addEdge(int a,int b,int c) { edge *tmp; tmp=&edges[ednum]; ednum++; tmp->id=b; tmp->w=c; tmp->next=adj[a]; adj[a]=tmp; } int main() { int a,b,c; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); addEdge(a,b,c); } SPFA(); printf("%d\n",dis ); }
相关文章推荐
- codeforces 478D D. Red-Green Towers(dp)
- scrapy学习--内置Spiders简介
- 买股票最大利润
- 补码
- 【IOS 开发学习总结-OC-28】★objective-c之foundation 框架——集合类的综述
- this关键字与super关键字
- kmp算法原理及实现
- waitpid(or wait)和SIGCHILD的关系 http://blog.csdn.net/liuxingen/article/details/38350347
- 【UML】用例图Use Case diagram
- win8搜索不到wifi怎么办?windows8搜索不到无线网络解决方法图解
- Git 从远程库克隆
- mysql、添加和删除用户、添加权限
- Project Euler 76:Counting summations
- php的迭代器
- Lock and Thread in JAVA
- ReentrantLock
- 程序员可能常犯的 6 个错误
- Word Break II
- Task-based Asynchronous Operation in WCF z
- task可声明参数 z