| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
spfa// 724K 32MS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int N = 30 + 5;
const int M = N * N;
int n, m;
char name[N][100];
struct Edge { int from, to; double rate; } edge[M];
int first[N], next[M], tot;
int queue[N], cnt[N], l, r;
double gain[N];
bool pd[N];
inline void addEdge(int from, int to, double rate)
{
Edge &e = edge[++tot];
e.from = from, e.to = to, e.rate = rate;
next[tot] = first[from], first[from] = tot;
}
inline bool relax(int e)
{
double tmp = gain[edge[e].from] * edge[e].rate;
if (tmp > gain[edge[e].to]) { gain[edge[e].to] = tmp; return true; }
return false;
}
bool spfa()
{
l = r = 0;
memset(pd, false, sizeof(pd));
memset(cnt, 0, sizeof(cnt));
memset(gain, 0, sizeof(gain)); gain[1] = 1.0;
queue[r++] = 1; pd[1] = true; cnt[1]++;
while (l != r)
{
int p = queue[l];
l = (l + 1) % N; pd[p] = false;
for (int e = first[p]; e; e = next[e]) if (relax(e))
{
int v = edge[e].to;
if (!pd[v])
queue[r] = v, r = (r + 1) % N, pd[v] = true, cnt[v]++;
if (cnt[v] > n) return true;
}
}
return false;
}
int main()
{
char name1[100], name2[100];
int kase = 0;
while (scanf("%d\n", &n) == 1 && n)
{
tot = 0;
memset(first, 0, sizeof(first));
memset(next, 0, sizeof(next));
for (int i = 1; i <= n; i++) gets(name[i]);
scanf("%d", &m);
for (int i = 1; i <= m; i++)
{
double rate; int v1, v2;
scanf("%s %lf %s", name1, &rate, name2);
for (int j = 1; j <= n; j++) if (strcmp(name1, name[j]) == 0) { v1 = j; break; }
for (int j = 1; j <= n; j++) if (strcmp(name2, name[j]) == 0) { v2 = j; break; }
addEdge(v1, v2, rate);
}
printf("Case %d: ", ++kase);
spfa() ? printf("Yes\n") : printf("No\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator