/*
这一题的关键思路:
只要在图中是否存在正权回路,可是判断可以无穷增加本金;而不是第一直觉,求一次最短路径,看本金是否增加;
所以,用floyd算法,第一次用,是本金经过其他总换点的兑换,其他币的价值,并且存下来,
第二次用floyd算法,是为了,和第一个用,作比较,看看其他币种的价值是否增加,如果是,那么判断是正权回路;
这么做的目的,判断正权回路,不单单是经过源点的正权回路,还有其他币种的正权回路;
*/
#include <iostream>
#include <cstring>
using namespace std;
int N, M, S;
double V;
typedef struct point{
double rate, commission;
} point;
point maze[105][105];
int piece[105];
int res = 100;
queue<int> que;
void init(){
res = 100;
for(int i=1; i<=M; ++i){
for(int j=1; j<=M; ++j){
maze[i][j].rate = maze[i][j].commission = 0;
}
}
}
double map[105] = {0};
int floyd(){
int i,j,k;
double d[105];
for(int i=1; i<=N; ++i) d[i] = map[i];
for(int k=1; k<=N; ++k){
for(int i=1; i<=N; ++i){
for(int j=1; j<=N; ++j){
if((map[i] - maze[i][j].commission) * maze[i][j].rate > map[j]){
map[j] = (map[i] - maze[i][j].commission) * maze[i][j].rate;
}
}
}
}
for(int i=1; i<=N; ++i){
if(d[i] < map[i]){
return 1;
}
}
return 0;
}
int main(){
int a,b;
double c,d,e,f;
scanf("%d %d %d %lf", &N, &M, &S, &V);
init();
for(int i=1; i<=M; ++i){
cin>>a>>b>>c>>d>>e>>f;
maze[a][b].rate = c;
maze[a][b].commission = d;
maze[b][a].rate = e;
maze[b][a].commission = f;
}
map[S] = V;
floyd();
if(floyd()){
printf("YES\n");
}else{
printf("NO\n");
}
return 0;
}
POJ 1860(二次用floyd, 判断每一个点 ,是否存在正权回路)
猜你喜欢
转载自blog.csdn.net/julicliy/article/details/79330372
今日推荐
周排行