最短路判负环uva11090

来源:互联网 发布:自学java看什么书 编辑:程序博客网 时间:2024/06/07 18:50

这道题注意输出格式是(刘汝佳上的原题不解释。。。)

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;elsel = mid;}printf("%.2lf\n", l);}k++;}return 0;}

原创粉丝点击