好吧终于知道什么是“高大上”的差分约束了。嗷嗷
题意:
小朋友们分糖果,某个小朋友不想另外一个小朋友分到的糖果数比自己多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 ",dis[n]); }