zoukankan      html  css  js  c++  java
  • ACM/ICPC 之 SPFA-兑换货币(POJ1860)

    //水题-SPFA解法
    //套汇是指兑换货币后能使本金上升
    //给定本金货币编号,货币间的汇率和手续费,求能否套汇成功
    //Time:16Ms	Memory:200K
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    
    #define MAX 105
    
    struct Edge {
    	int u, next;
    	double w, c;
    	Edge(){}
    	Edge(int u, double w, double c, int n):u(u), w(w), c(c), next(n){}
    }e[2*MAX];
    
    int n, m, st;
    double my;
    int h[MAX];
    double d[MAX];
    bool v[MAX];
    
    bool spfa(int x)
    {
    	memset(d, 0, sizeof(d));
    	memset(v, 0, sizeof(v));
    	queue<int> q;
    	q.push(x);
    	d[x] = my;	v[x] = true;
    	while (!q.empty()){
    		int cur = q.front();
    		q.pop();	v[cur] = false;
    		for (int i = h[cur]; i != -1; i = e[i].next)
    		{
    			int u = e[i].u;
    			double w = e[i].w, c = e[i].c;
    			if ((d[cur] - c) * w > d[u]){
    				d[u] = (d[cur] - c) * w;
    				if (u == x) return true;	//更新了源点,则套汇成功
    				if (!v[u]) {
    					v[u] = true;	q.push(u);
    				}
    			}
    		}
    	}
    	return false;
    }
    
    int main()
    {
    	memset(h, -1, sizeof(h));
    	scanf("%d%d%d%lf", &n, &m, &st, &my);
    	for (int i = 0; i < m; i++)
    	{
    		int u, v;
    		double w, c;
    		scanf("%d%d%lf%lf", &u, &v, &w, &c);
    		e[2 * i] = Edge(v, w, c, h[u]);	h[u] = 2 * i;
    		scanf("%lf%lf", &w, &c);
    		e[2 * i + 1] = Edge(u, w, c, h[v]);	h[v] = 2 * i + 1;
    	}
    	if (spfa(st)) printf("YES
    ");
    	else printf("NO
    ");
    
    	return 0;
    }
    
  • 相关阅读:
    [CF1295E] Permutation Separation
    [APIO2010] 特别行动队
    [CF1296F] Berland Beauty
    [CEOI2004] 锯木厂选址
    [CF1334E] Divisor Paths
    Review 2020.11.14
    [CQOI2016] 手机号码
    [LEETCODE600] 不含连续1的非负整数
    [CF55D] Beautiful numbers
    内存取证工具volatility
  • 原文地址:https://www.cnblogs.com/Inkblots/p/5565932.html
Copyright © 2011-2022 走看看