poj 1860 SPFA

本文探讨了在货币交换网络中判断货币是否能增殖的方法,通过SPFA算法解决正权环问题,以及如何利用松弛操作修改求最大值的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

             心累才是最可怕的,好几天没上poj,这样不行,明天开始,继续每天一题。

            如题:http://poj.org/problem?id=1860

 

 

           给出一张各种货币交换的网络,问在网络中交换原有的货币,问货币能否增值?

 

          1.当图中存在正权环时,肯定货币是可以增值的。

          2.不存在正权环时,也有可能增值,用spfa算法,松弛操作修改求大的值,如果dist[src]>v(v是原有的钱数),也是可以增值的。

          3.2条都不行,不能增值。

        

          注意是双向边,边表大小是2倍。

           用静态邻接表实现SPFA即可。

             

        

#include<iostream>
using namespace std;
#include<queue>
//#define inf 0x0fffffff
#define MAXN 105
#define MAXM 105

int head[MAXN];
int next[MAXM*2];
double dis[MAXN];
int vis[MAXN];
int cnt[MAXN];
 double v;
struct note
{
 double rate,commission;
 int u,v;
 note(){}
 note(int u,int v,double rat,double com):u(u),v(v),rate(rat),commission(com){}
}p[MAXM*2];
int e,n,m;
void addnote(int u,int v,double r,double c)
{
 p[e]=note(u,v,r,c);
 next[e]=head[u];
 head[u]=e++;

}

int spfa(int s)
{
 int i;
 for(i=1;i<=n;i++)
  dis[i]=-1;
 dis[s]=v;
 vis[s]=true;
 queue<int>que;
 que.push(s);
 cnt[s]=1;
 while(!que.empty())
 {
  int pre=que.front();
  que.pop();
  vis[pre]=false;
  double cur=dis[pre];
  for(i=head[pre];i!=-1;i=next[i])
  {
   int v=p[i].v;
   double r=p[i].rate;
   double c=p[i].commission;
   double tmp=(cur-c)*r;
   if(tmp>dis[v])
   {
    dis[v]=tmp;
    if(!vis[v])
    {
     que.push(v);
     cnt[v]++;
     vis[v]=1;
     if(cnt[v]>n)
      return true;
    }
   }
  }
  if(dis[s]>v)
   return true;
 }
 return false; 
}

int main()
{
 int s;
 
// freopen("C:\\1.txt","r",stdin);
 scanf("%d%d%d%lf",&n,&m,&s,&v);
 memset(head,-1,sizeof(head));
// memset(next,-1,sizeof(next));
 memset(vis,0,sizeof(vis));
 memset(cnt,0,sizeof(cnt));
 e=0;
 int i;
 for(i=0;i<m;i++)
 {
  int u,v;
  double r1,c1,r2,c2;
  scanf("%d%d%lf%lf%lf%lf",&u,&v,&r1,&c1,&r2,&c2);
  addnote(u,v,r1,c1);
  addnote(v,u,r2,c2);
 }
 if(spfa(s))
  printf("YES\n");
 else
  printf("NO\n");

 return 0;
}

 

 

### 关于 POJ 2092 的问题分析 POJ 平台上的题目通常涉及算法设计与实现,而编号为 2092 的具体题目并未在提供的引用中明确提及。然而,可以通过已知的相关资源和经验推测其可能的解决方法。 #### 差分约束系统的应用 如果假设 POJ 2092 类似于其他差分约束类问题,则可以参考类似的解决方案[^3]。这类问题的核心在于通过构建不等式组来表示变量之间的关系,并将其转化为图论中的最短路径或最长路径问题。例如: - 对于条件 \( P \),\( A - B = X \) 可以被分解为两个不等式: \( A - B \geq X \) 和 \( A - B \leq X \)[^3]。 - 对于条件 \( V \),则有 \( A - B \geq 1 \)。 这些不等式可以用边的形式表示在一个加权图中,随后运行 SPFA 或 Bellman-Ford 算法检测是否存在满足所有约束的解集。特别需要注意的是引入一个超级源点连接到所有节点,从而保证整个图连通性。 #### 动态规划 vs 常规方法对比 针对某些特定类型的优化问题,动态规划 (Dynamic Programming, DP) 方法能够显著提高效率并减少冗余计算量。相比之下,传统方式可能会因为重复子问题而导致性能瓶颈。尽管当前讨论未直接指向 POJ 2092 是否适用此技术路线,但从更广泛意义上看,DP 是处理复杂状态转移的有效工具之一[^2]。 以下是基于上述理论框架的一个简单 Python 实现例子用于验证可行性: ```python from collections import deque def spfa(n, edges): INF = float('inf') dist = [-INF] * n in_queue = [False] * n q = deque() s = 0 # Super source node index. # Initialize distances from super-source to all nodes as zero. for i in range(n): if not in_queue[i]: q.append(i) in_queue[i] = True while q: u = q.popleft() in_queue[u] = False for v, w in edges.get(u, []): if dist[v] < dist[u] + w: dist[v] = dist[u] + w if not in_queue[v]: q.append(v) in_queue[v] = True return any(dist[i] >= INF / 2 for i in range(1,n)) # Example usage with dummy data representing constraints... if __name__ == "__main__": N = 5 # Number of variables plus one extra 'super' start point. E = {0:[(i,0)for i in range(1,N)]} # Connects every variable directly via weight-zero links. result = spfa(N,E) print("Positive cycle exists:",result) ``` 以上代码片段展示了如何运用队列辅助广度优先搜索(SPFA)寻找潜在正向循环逻辑链路结构。这一步骤对于判定是否有可行方案至关重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值