POJ - 3159 不卡建图,几乎赤果果的差分约束+SPFA..

   题意是说...有N个小朋友..每个人有糖果..给出M给关于两两手中糖果数关系..a b c 代表b手中的糖果不会比a打出c个..求小朋友间两人差距可能最大会是多少...

   抽象来就是给出 M 个关系 a - b <= c 之类的..然后求两两之差最大的值....这道题不会卡建图..用SPFA也没必要用超级点或者先把所有点入列...

   但这道题用SPFA十分蛋疼的是用queue会超时...用stack就过了~~至今不知道为什么....实在SPFA用queue和stack应该是没区别的....


Prgram:

#include<iostream>
#include<stack>
#define MAXN 30001
using namespace std;
struct p1
{
    int x,y,next,k;      
}line[MAXN*10];
int n,m,i,link[MAXN];
stack<int> mystack;
int SPFA()
{
   int k,h,i,d[MAXN];
   bool used[MAXN];
   while (!mystack.empty()) mystack.pop();
   memset(used,false,sizeof(used));
   memset(d,0x7F,sizeof(d));
   d[1]=0; mystack.push(1);
   while (!mystack.empty())
   {
       h=mystack.top();
       mystack.pop();
       used[h]=false;
       k=link[h];
       while (k)
       {
           if (d[line[k].y]>d[h]+line[k].k)
           {
                d[line[k].y]=d[h]+line[k].k;
                if (!used[line[k].y])
                {
                    used[line[k].y]=true;
                    mystack.push(line[k].y);                     
                }                           
           }  
           k=line[k].next;     
       }   
   }   
   return d[n];
} 
int main()
{ 
   while(~scanf("%d%d",&n,&m))
   {
       memset(link,0,sizeof(link));                       
       for (i=1;i<=m;i++) 
       {
           scanf("%d%d%d",&line[i].x,&line[i].y,&line[i].k);    
           line[i].next=link[line[i].x];
           link[line[i].x]=i;
       }
       printf("%d\n",SPFA());
   }
   return 0;   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值