POJ 3159 Candies 差分约束+spfa

来源:互联网 发布:网络射击游戏有哪些 编辑:程序博客网 时间:2024/05/16 00:50
/*不知道为什么写成队列就过不了,写成栈就过了……题意是:班长分糖果,每个学生心中都有一个标准,a b c 既 a学生认为b的糖果数应满足b-a<=c;最后求差异最大,既分到最多糖果数-分到最少糖果数目建图依据参见:http://blog.csdn.net/wsniyufang/article/details/6626046代码一:转换为最短路问题*/#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<stack>#include<map>#include<algorithm>using namespace std;const int maxn=50002;const int MAXM=1000009;const int inf=999999999;int n,m;struct Edge{int v,w;int next;}edge[4*maxn];bool cmp(Edge x,Edge y){return x.w<y.w;}int e,top;int first[maxn];int vis[maxn];int Stack[10*maxn];void addedge(int u,int v,int w){edge[e].v=v;edge[e].w=w;edge[e].next=first[u];first[u]=e++;}int d[maxn];void spfa(int scr){for(int i=1;i<=n;i++)d[i]=inf;d[scr]=0;int front=-1,rear=-1;Stack[++top]=scr;while(top>-1){int x=Stack[top--];vis[x]=0;for(int k=first[x];k!=-1;k=edge[k].next){if(d[edge[k].v]>d[x]+edge[k].w){d[edge[k].v]=d[x]+edge[k].w;if(!vis[edge[k].v]){vis[edge[k].v]=1;Stack[++top]=edge[k].v;}}}}int sum=0;printf("%d\n",d[n]);}int main(){while(scanf("%d%d",&n,&m)!=EOF){e=0;top=-1;int a,b,c;memset(vis,0,sizeof(vis));memset(first,-1,sizeof(first));for(int i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);addedge(a,b,c);}for(int i=1;i<=n;i++){addedge(i,n+1,0);}// sort(edge,edge+e,cmp);spfa(1);}}