您的位置:首页 > 其它

poj1860

2013-03-06 23:33 120 查看
自己做的第一个图论题目,看别人的思路写的,第一次对最短路径有了一点的了解。

BellmanFord算法的应用,将每种种类的货币看成是一个点,算源点到源点的最长路径。每个点进行松弛的时候就按照(钱 - 佣金) * 比率来松弛

代码如下:

#include <stdio.h>
#include <string.h>

#define MAX_NUMBER 400

struct Edge {
int start_point;
int end_point;
double commission;
double rate;
};

struct Edge edge[MAX_NUMBER];
int original_currency, point_number, currency_number;
int edge_number;
double distance[MAX_NUMBER];
double original_money;

int bellmanFord() {
int flag, i;
int start_point, end_point;
double temp_money;
memset(distance, 0 ,sizeof(distance));
distance[original_currency] = original_money;
while (distance[original_currency] <= original_money) {
flag = 0;
for (i = 0; i < edge_number; i++) {
start_point = edge[i].start_point;
end_point = edge[i].end_point;
temp_money = (distance[start_point] - edge[i].commission) * edge[i].rate;
if (distance[end_point] < temp_money) {
distance[end_point] = temp_money;
flag = 1;
}
}
if (!flag) {
return distance[original_currency] > original_money;
}
}
return 1;
}

int main() {

int start_point, end_point, i;
double rate_a, commission_a, rate_b, commission_b;
while (scanf("%d%d%d%lf", ¤cy_number, &point_number, &original_currency, &original_money) != EOF) {
edge_number = 0;
for (i = 0; i < point_number; i++) {
scanf("%d%d%lf%lf%lf%lf", &start_point, &end_point, &rate_a, &commission_a, &rate_b, &commission_b);
edge[edge_number].start_point = start_point;
edge[edge_number].end_point = end_point;
edge[edge_number].rate = rate_a;
edge[edge_number].commission = commission_a;
edge_number++;

edge[edge_number].start_point = end_point;
edge[edge_number].end_point = start_point;
edge[edge_number].rate = rate_b;
edge[edge_number].commission = commission_b;
edge_number++;
}
if (bellmanFord()) {
printf("YES\n");
}
else {
printf("NO\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: