其他分享
首页 > 其他分享> > poj1860 spfa判断正环

poj1860 spfa判断正环

作者:互联网

——一切都回来了,用csj的话。

这货上次在群里说一道spfa判负环的题改半天,改出来的那刻觉得一切都回来了。

hh,都想起来了吗,在机房被支配的恐惧和ac的快乐。

 

#

觉得这个n可以用弗洛伊德,但觉得弗洛伊德维护不了那么复杂的情况

#

写了一个dij——

那么问题来了,dij的板子里有一个是vis数组,用来标记是否用过,那我这个魔改过的版本,到底是加or不加?

加的话会妨碍其他节点的更新,不加的话会变得很大很大——怎么判断大到什么程度?

#

正解是spfa(spfa你终于活了)判断正环的模板题。

有个小smart power是只要存在环,无论有无该货币点都可以,因为可以换无数次后再兑换回去,仍然是降维打击。

..一切都回来了啊。

 

-----

还没ac,但困,待填。20211005;

#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <cstdio>
using namespace std;
double n,m,v,s;
struct node{
    double   rab,cab,rba,cba;
}atm[maxn];
struct lys{
    double v,s,id;
};
//RAB, CAB, RBA and CBA 
void dij(double v,double s)
{
    
    for(int i=1;i<=maxn;i++)
     {
         d[i][0]=-20211002.0;
         d[i][1]=-20211002.0;
     }
    double ans;
    
    
    lys start;
    start.v=v;
    start.s=s;
    ans=start.v;
    
    while(!q.empty( ))
    {
       lys now;
       now=q.front( );
       //从now这个atm出来 ,身上的币种
       q.pop( );
       
       for(int i=1;i<=m;i++)
       {
             if(atm[i].a==now.s)
              {
                  
                  double change;
                  change=(now.v-cab)*rab;
                 if(change-d[i][1]>0.000001)
                  {
                       d[i][1]=change;
                       lys son;
                       son.s=atm[i].b;
                       son.v=d[i][1];
                       son.id=i;
                       q.push(son);
                       if(atm[i].b==s) ans=max(ans,change);
                }
           }
          if(atm[i].b==now.s)
              {
                  double change;
                  change=(now.v-cba)*rba;
                 if(change-d[i][0]>0.000001)
                  {
                       d[i][0]=change;
                       lys son;
                       son.s=atm[i].a;
                       son.v=d[i][0];
                       son.id=i;
                       q.push(son);
                       if(atm[i].b==s) ans=max(ans,change);
                }
           }  
       }    
    }
    
    
}
int main( )
{
  cin>>n>>m>>s>>v;
  for(int i=1;i<=m;i++)
   {
        scanf("%lf%lf%lf%lf%lf%lf",&atm[i].a,&atm[i].b,&atm[i].rab,&atm[i].cab,&atm[i].rba,&atm[i].cba);
   }
   
  dij(v,s);     
} 

 

标签:正环,double,atm,son,spfa,poj1860,include,change
来源: https://www.cnblogs.com/liyishui2003/p/15368981.html