1. 程式人生 > >POJ 1860(最短路之Bellman-Ford)

POJ 1860(最短路之Bellman-Ford)

題意:首先給出四個數n,m,s,v,分別表示n種貨幣,m個兌換關係,s源貨幣,源貨幣的本金v

然後給出m行,每行給出6個數beg,end,r1,c1,r2,c2,分別表示beg和end貨幣兌換的比率和手續費,end和beg貨幣兌換的比率和手續費

。問能否通過貨幣兌換使手裡的源貨幣依然是第s中貨幣,並且本金增多。

思路:感覺如果不是對最短路演算法很熟悉的話,這道題很不好做。實際上這道題是Bellman-Ford的變形,求最長路徑,利用Bellman-Ford

演算法的思想,判斷是否存在正環就可以了。具體程式碼實現如下。

(順便補充一句,最近剛接觸Bellman-Ford演算法,感覺像是在Dijsktra演算法的基礎上增加一層迴圈判斷是否存在負環就可以了,另外,從效率上

來看,個人感覺無負權圖優先考慮Dijsktra,帶負權圖優先考慮SPFA,似乎Bellman-Ford用的地方比較少)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=505;
int n,m,s;
double v;
double dis[maxn];
int e;

struct Edge{
	int u;
	int v;
	double r;
	double c;
}edge[maxn];

void addEdge(int u,int v,double r,double c){
	edge[e].u=u;
	edge[e].v=v;
	edge[e].r=r;
	edge[e].c=c;
	e++;
}

bool relax(int j){
	if(dis[edge[j].v]<(dis[edge[j].u]-edge[j].c)*edge[j].r){
		dis[edge[j].v]=(dis[edge[j].u]-edge[j].c)*edge[j].r;
		return true;
	}
	return false;
}

bool Bellman_Ford(){
	memset(dis,0,sizeof(dis));
	dis[s]=v;
	bool flag;
	for(int i=1;i<n;i++){
		flag=false;
		for(int j=0;j<e;j++){
			if(relax(j))
				flag=true;
		}
		if(dis[s]>v) return true;
		if(!flag) return false;
	}
	for(int k=0;k<e;k++){
		if(relax(k))
			return true;
	}
	return false;
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
#endif
	while(~scanf("%d%d%d%lf",&n,&m,&s,&v)){
		e=0,s--;
		int beg,end;
		double r1,c1,r2,c2;
		for(int i=0;i<m;i++){
			scanf("%d%d%lf%lf%lf%lf",&beg,&end,&r1,&c1,&r2,&c2);
			beg--,end--;
			addEdge(beg,end,r1,c1);
			addEdge(end,beg,r2,c2);
		}
		bool ans=Bellman_Ford();
		if(ans==1) puts("YES\n");
		else puts("NO\n");
	}
	return 0;
}


相關推薦

POJ 1860短路Bellman-Ford

題意:首先給出四個數n,m,s,v,分別表示n種貨幣,m個兌換關係,s源貨幣,源貨幣的本金v 然後給出m行,每行給出6個數beg,end,r1,c1,r2,c2,分別表示beg和end貨幣兌換的比率和手續費,end和beg貨幣兌換的比率和手續費 。問能否通過貨幣兌換使手裡

短路Bellman-ford演算法

今天看啊哈演算法搞懂了Bellman-ford演算法,其實核心程式碼只有四行,還是蠻簡單的,寫了一個板子,程式碼分析容後再議 (我才不是想水部落格呢……) #include <iostream

2253 短路變形 Bellman-Ford

傳送門題目大意: 題意很簡單就是有一個公青蛙想要去找母青蛙, 然後水上有n個石頭, 公青蛙在第一個上, 母青蛙在第二個. 然後給出n個石頭的座標, 求一個最小的跳躍距離, 這個跳躍距離是它所有的跳躍中距

poj 3268 短路 spfa

Language: Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12910 Accepted: 5776 Description One cow fro

POJ 3268 Silver Cow Party 短路,置換矩陣

One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X

昂貴的聘禮 POJ - 1062短路

在那 poj 方便 .... scanf using str per 但是 年輕的探險家來到了一個印第安部落裏。在那裏他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麽多金幣,便請求酋長降低要求。酋長說:"嗯,如

演算法專題 | 10行程式碼實現的短路演算法——Bellman-ford與SPFA

今天是演算法資料結構專題的第33篇文章,我們一起來聊聊最短路問題。 最短路問題也屬於圖論演算法之一,解決的是在一張有向圖當中點與點之間的最短距離問題。最短路演算法有很多,比較常用的有bellman-ford、dijkstra、floyd、spfa等等。這些演算法當中主要可以分成兩個分支,其中一個是bellma

驗證碼識別簡單印刷體數字

轉化 end double show ray app def 藍色 代碼實現 # -*- coding: utf-8 -*- import numpy from PIL import Image image = Image.open("5.gif") heigh

Til the Cows Come Home 短路問題, 模板

題目:https://vjudge.net/problem/POJ-2387  Bessie is out in the field and wants to get back to the barn to get as much sleep as possible befor

演算法作業 短路+記錄全部路徑

思路:採用n*logn的優化迪傑斯特拉演算法,求出最短路,反向建圖以後,在dfs搜尋即可,用set+vector記錄路徑,注意vector的傳遞需要加引用(用string 就不用加引用)。 實現非常簡單,直接看程式碼就行。 #include <bits/stdc++.h> usi

【洛谷3953】逛公園短路+記憶化搜尋

點此看題面 大致題意: 有一張有NNN個點和MMM條邊組成的有向圖,若從111號點到NNN號點的最短路徑長度為ddd,問有多少條從111號點到NNN號點的路徑長度不超過d+Kd+Kd+K。若有無數條輸出

POJ 2217 長公共子串

先考慮一個簡單的問題,計算一個字串中至少出現兩次以上的最長子串,答案一定會在後綴陣列中相鄰兩個字尾的公共字首之中,所有隻要考慮他們就好了,原因是子串的開始位置在後綴中相距越遠,其公共字首的長度也就越短,因此,高度陣列的最大值就是答案。 再考慮這個問題的解法,因為對於兩個字串

【NOIP 2017】逛公園短路+記憶化搜尋

肯定要先跑一次最短路 題目中的k 相當於允許我們走k距離的“冤枉路” 回想之前有些題是如何判斷哪些邊是屬於最短路上的 當dis[now]+edge[u].val==dis[vis] 這條邊就在最短路上 類似的 我們可以得出 dis[now]+edge[u].val-dis[vis]就是這一次走的“冤枉路”的長

K.MIKU醬的氪金寶典 短路變形||dfs+剪枝

https://ac.nowcoder.com/acm/contest/221/K #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #in

POJ 1458長公共子序列

Time Limit: 1000MS Memory Limit: 10000K Description A subsequence of a given sequence is the given sequence with some elemen

【NOIP2017提高】逛公園短路+記憶化搜尋

原題見洛谷。 分析 1,既然需要最短路做基礎,所以需要做一遍最短路演算法。 2,有的點可能到不了N,所以正反各建一個圖,用反向圖跑出dis[i]表示i距離N的最短距離。 3,K最大為50,所以考慮dp的做法。設f[i][k]表示i到N,實際距離-dis[i]<

訓練指南 UVA - 10917短路Dijkstra + 基礎DP

多次 i++ 記憶化 上一條 是否 而且 false 點列 type layout: post title: 訓練指南 UVA - 10917(最短路Dijkstra + 基礎DP) author: "luowentaoaa" catalog: tru

Tram 短路練習模板題

Tram network in Zagreb consists of a number of intersections and rails connecting some of them. In every intersection there is a switch

CCF-交通規劃短路變形->dj演算法

問題描述   G國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設一個高速鐵路系統。   建設高速鐵路投入非常大,為了節約建設成本,G國國王決定不新建鐵路,而是將已有的鐵路改造

poj 1860 -- Currency ExchangeBellman-Ford

ase 類型 操作 ring itl 完成 title 循環 sta poj 1860 -- Currency Exchange(Bellman-Ford) 題意: 我們的城市有幾個貨幣兌換點。讓我們假設每一個點都只能兌換專門的兩種貨幣。可以有幾個點,專門從事相同貨幣兌換