标签:
/*
*POJ 1860 Currency Exchange
*判断回路是否能使初始值增长
*/
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 600
struct ArcNode {
int to;
double r;
double c;
ArcNode *next;
};
queue<int> q;
int N, M, S;
double V;
ArcNode *list[MAXN]; //每个顶点的边链表表头指针
bool visit[MAXN]; //每个顶点是否在队列
int count[MAXN]; //每个顶点入队列的次数
double dist[MAXN];
bool spfa(int src)
{
int i, u, v;
ArcNode *temp;
for (i = 1 ; i <= N; i++) {
dist[i] = 0;
}
dist[src] = V;
q.push(src);
while ( !q.empty()) {
if(dist[src] > V) return true;
u = q.front();
q.pop();
temp = list[u];
while (temp != NULL) {
v = temp->to;
if (dist[v] < (dist[u] - temp->c) * temp->r) {
dist[v] = (dist[u] - temp->c) * temp->r;
if (!visit[v]) {
q.push(v); visit[v] = 1;
}
count[v]++;
if (count[v] > N) //存在回路
return true;
}
temp = temp->next;
}
visit[u] = 0;
}
return false;
}
int main()
{
int i, T;
int u, v;
double r, c;
while (~scanf("%d %d %d %lf", &N, &M, &S, &V)) {
memset(list, 0, sizeof(list));
memset(visit, 0, sizeof(visit));
memset(count, 0, sizeof(count));
while (!q.empty()) {
q.pop();
}
ArcNode *temp;
for (i = 0; i < M; i++) {
scanf("%d %d %lf %lf", &u, &v, &r, &c);
temp = new ArcNode;
temp->to = v; temp->r = r; temp->c = c; temp->next = NULL;
if (list[u] == NULL) {
list[u] = temp;
} else {
temp->next = list[u]; list[u] = temp;
}
scanf("%lf %lf", &r, &c);
temp = new ArcNode;
temp->to = u; temp->r = r; temp->c = c; temp->next = NULL;
if (list[v] == NULL) {
list[v] = temp;
} else {
temp->next = list[v]; list[v] = temp;
}
}
if (spfa(S)) {
printf("YES\n");
} else {
printf("NO\n");
}
for (i = 1; i <= N; i++) {
temp = list[i];
while (temp != NULL) {
list[i] = temp->next; delete temp; temp = list[i];
}
}
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/subrshk/p/4249346.html