| ||||||||||
| 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 | |||||||||
floyd为何外层循环需要循环n*5次才能AC呢?求解释~~以下代码,若mian函数调用spfa会32msAC,floyd会100+msAC,不明白的是为何floyd中外层循环需要执行n*5次,我试了n+1(WA),n*2(WA),n*3(WA),n*5(AC),n*10(AC),n*50(AC),n*100(TLE)....
求解释,是不是用floyd有问题呢?这个5肯定没有什么含义,那么外层应该如何写呢?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <deque>
#include <stack>
#include <queue>
#include <iterator>
#include <list>
#include <algorithm>
#include <bitset>
#include <set>
#include <sstream>
#include <functional>
using namespace std;
const int N = 105;
int n,m;
int st;
double sum;
double r[N][N];
double c[N][N];
void input() {
scanf("%d%d%d%lf",&n,&m,&st,&sum);
--st;//第一个注意的地方,因为我做的是下标从0开始,题中是从1开始
memset(r,0,sizeof(r));
memset(c,0x3f,sizeof(c));//第二个注意的地方,如果初始化为0就可以随意换了
for (int i=0; i<m; ++i) {
int a,b;
double rab,cab,rba,cba;
scanf("%d%d%lf%lf%lf%lf",&a,&b,&rab,&cab,&rba,&cba);
r[a-1][b-1] = rab;
c[a-1][b-1] = cab;
r[b-1][a-1] = rba;
c[b-1][a-1] = cba;
}
}
bool floyd() {
double d[N];
memset(d, 0, sizeof(d));
d[st] = sum;
for (int i = 0; i < n; ++ i) {
if ((d[st]-c[st][i])*r[st][i]>d[i]) {
d[i] = (d[st]-c[st][i])*r[st][i];
}
}
for (int k = 0; k < n*5; ++ k) {//此处为何需要乘以5才能过呢?疑惑中⋯⋯
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
if ((d[i]-c[i][j])*r[i][j] > d[j]) {
d[j] = (d[i]-c[i][j])*r[i][j];
}
}
}
}
return d[st]>sum;
}
bool spfa() {
double d[N];
memset(d,0,sizeof(d));//第三个注意地方,除了起始,所有货币最大值的下限都要初始化为0
d[st] = sum;
bool v[N];
memset(v, 0, sizeof(v));
v[st] = 1;
int cnt[N];
memset(cnt, 0, sizeof(cnt));
cnt[st] = 1;
queue<int> que;
que.push(st);
while (!que.empty()) {
int u = que.front(); que.pop(); v[u] = 0;
for (int i = 0; i < n; ++ i) {
double t = (d[u]-c[u][i])*r[u][i];//第四个注意的地方,无他,double————写int写习惯了,调了半天错,非常郁闷
if (t > d[i]) {
d[i]=t;
if (!v[i]) {
v[i]=1;
if (++cnt[i]>n) {
return 1;
}
que.push(i);
}
}
}
}
return d[st]>sum;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("/Users/songzhipeng/Desktop/in.in","r",stdin);
freopen("/Users/songzhipeng/Desktop/out.out", "w", stdout);
#endif
input();
printf("%s",floyd()?"YES":"NO");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator