又WA无数。。。。。坑爹啊,就不能让我一次A吗??
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int MAXN = 107;
const int INF = 1 << 27;
struct BellmanFord {
vector<int> G[MAXN];
vector<double> W[MAXN];
double d[MAXN];
bool inque[MAXN];
int cnt[MAXN];
int n;
void init(int n) {
this->n = n;
for(int i = 1; i <= n; i++) {
G[i].clear();
W[i].clear();
}
}
void add(int u, int v, double d) {
G[u].push_back(v);
W[u].push_back(d);
}
void dadd(double d) {
int i, j, sz;
for(i = 1; i <= n; i++) {
sz = W[i].size();
for(j = 0; j < sz; j++) W[i][j] += d;
}
}
bool judge() {
int i, u, v, sz;
memset(cnt, 0, sizeof(cnt));
queue<int> q;
for(i = 1; i <= n; i++) {
d[i] = 0;
q.push(i);
inque[i] = true;
}
while(!q.empty()) {
u = q.front();q.pop();
inque[u] = false;
sz = G[u].size();
for(i = 0; i < sz; i++) {
v = G[u][i];
if(d[v] > d[u] + W[u][i]) {
d[v] = d[u] + W[u][i];
if( !inque[v]) {
inque[v] = true;
q.push(v);
if(++cnt[v] > n) return true;
}
}
}
}
return false;
}
};
BellmanFord Bell;
bool text(double d) {
Bell.dadd(-d);
bool ret = Bell.judge();
Bell.dadd(d);
return ret;
}
int main() {
int T, id = 0;
scanf("%d", &T);
while(T--) {
int i, n, m, u, v, d;
scanf("%d%d", &n, &m);
Bell.init(n);
int maxd = 0;
for(i = 1; i <= m; i++) {
scanf("%d%d%d", &u, &v, &d);
Bell.add(u, v, d);
maxd = max(maxd, d);
}
printf("Case #%d: ", ++id);
if( !text(maxd+1)) puts("No cycle found.");
else {
double l = 0, h = maxd, m;
while(h - l > 1e-4) {
m = (l + h) / 2;
if(text(m)) h = m;
else l = m;
}
printf("%.2lf\n", l);
}
}
return 0;
}