POJ

来源:互联网 发布:centos查看系统编码 编辑:程序博客网 时间:2024/05/21 12:44
/*:flymouse是幼稚园班上的班长,一天老师给小朋友们买了一堆的糖果,由flymouse来分发。flymouse希望自己分得的糖果数尽量多于snoopy。对于其他小朋友而言,则必须自己得到的糖果不少于班上某某,给出m个关系(A,B,C),B获得的糖果数不能多于A C个问flymouse最多能多snoopy几个糖果。那么这样就形成了一种差分约束B-A<C,变形一下就是 B<A+C,这样的话是不是还是间接的转化为了最短了问题;那么它需要的是最后一个人最多比自己多多少个糖果;解法呢就是:SPFA 栈的优化;当然dijkstra就不能写了  点比较多嘞;*/#include<cstdio>#include<stack>using namespace std;const int maxn=1e6+7;const int inf=0x3f3f3f3f;bool vis[maxn];int head[maxn],dis[maxn];int n,m;struct node{    int to,w,next;}eage[maxn];void Add(int i,int u,int v,int w)///前向星建图;{    eage[i].to=v;    eage[i].w=w;    eage[i].next=head[u];    head[u]=i;}void SPFA(){    for(int i=1;i<=n;i++)    {        dis[i]=inf;        vis[i]=0;    }    dis[1]=0;    stack<int>Q;///这个就不手写栈了;它的测试数据可能有点问题,就是让你的stack过 queue过不了;    Q.push(1);    while(!Q.empty())    {        int u=Q.top();        Q.pop();        vis[u]=0;        for(int i=head[u];i!=-1;i=eage[i].next)        {            int v=eage[i].to;            if(dis[v]>dis[u]+eage[i].w)///找最小的;            {                dis[v]=dis[u]+eage[i].w;                if(!vis[v]) {vis[v]=1;Q.push(v);}            }        }    }}int main (){    while(~scanf("%d %d",&n,&m))    {        for(int i=1;i<=n;i++)            head[i]=-1;        for(int i=1;i<=m;i++)        {            int u,v,w;            scanf("%d %d %d",&u,&v,&w);            Add(i,u,v,w);        }        SPFA();        printf("%d\n",dis[n]);    }    return 0;}
原创粉丝点击