这道题注意输出格式是(刘汝佳上的原题不解释。。。)
No circle found.而不是No circle found
还容易出错的地方1.数组大小2.变量的类型(是否会超出变量表示范围)3.边界条件。
此题我觉得是应该有负边但很显然没有相应的测试样咧(我用别人有bug的代码交过。。)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
struct edgee
{
int to;
double value;
};
edgee edge[10000];
int nextt[10000], first[500], isinque[500], times[500];
double dist[500];
int edgetot = 0;
int n, m;
void addedge(int a, int b, double c)
{
edge[edgetot].to = b;
edge[edgetot].value = c;
nextt[edgetot] = first[a];
first[a] = edgetot;
edgetot++;
}
bool spfa()
{
queue<int>que;
for (int i = 1; i <= n; i++) times[i] = 0, isinque[i] = 0, que.push(i), dist[i] = 0;
while (!que.empty())
{
int temp = que.front();
que.pop();
isinque[temp] = 0;
for (int i = first[temp]; i != -1; i = nextt[i])
{
int to = edge[i].to;
if (dist[to] > dist[temp] + edge[i].value)
{
dist[to] = dist[temp] + edge[i].value;
if (!isinque[to])
{
isinque[to] = 1;
que.push(to);
times[to]++;
if (times[to]>=n+1)return true;
}
}
}
}
return false;
}
bool control(double value)
{
for (int i = 0; i < edgetot; i++)edge[i].value-= value;
bool k = spfa();
for (int i = 0; i < edgetot; i++)edge[i].value += value;
return k;
}
int main()
{
int k = 1;
int t;
scanf("%d", &t);
while (t--)
{
double l = 999999999, r =-999999999;
scanf("%d%d", &n, &m);
for (int i = 1; i < 500; i++)first[i] = -1;
edgetot = 0;
for (int i = 0; i < m; i++)
{
int a, b; double c;
scanf("%d%d%lf", &a, &b,&c);
addedge(a, b, c);
l = min(l, c);
r = max(r, c);
}
//control(2.5);
printf("Case #%d: ", k);
if (!control(r+1))
{
printf("No cycle found.\n");
}
else
{
while (r - l > 1e-4)
{
double mid = (l + r) / 2.0;
bool k=control(mid);
if (k)
r = mid;
else
l = mid;
}
printf("%.2lf\n", l);
}
k++;
}
return 0;
}