| ||||||||||
| 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错哪了#include<cstdio>
#include<queue>
#define MN 2000
#define ME 20000
using std::queue;
#define UNCONN -1.0
struct
{
int to;
int pre;
double rate;
double commission;
}edge[ME];
int box[MN];
int lenE;
void iniPreList(int n)
{
int i;
for(i=0;i<=n;i++)
{
box[i] = UNCONN;
}
lenE = 0;
}
void addDirectedEdge(int frm,int to,double rate,double commission)
{
edge[lenE].to = to;
edge[lenE].rate = rate;
edge[lenE].commission = commission;
edge[lenE].pre = box[frm];
box[frm] = lenE++;
}
void addDoubleEdge(int a,int b,double rate,double commission)
{
addDirectedEdge(a,b,rate,commission);
addDirectedEdge(b,a,rate,commission);
}
bool isNotInQueue[MN];
double money[MN];
int cntRelax[MN];
class node
{
public:
int to;
double w;
node(int tt,double ww):to(tt),w(ww){}
};
bool spfa(double mymoney,int start,int destination,int n)
{
//初始化
int i;
for(i=1;i<=n;i++)
{
isNotInQueue[i] = true;
money[i] = UNCONN;
cntRelax[i]=0;
}
money[start] = mymoney;
node cur(start,mymoney);
queue<node> dq;
int adsIndex;
double tmpMoney;
dq.push(cur);
isNotInQueue[cur.to] = false;
while(!dq.empty())
{
cur = dq.front();
dq.pop();
isNotInQueue[cur.to] = true;
for(adsIndex = box[cur.to];adsIndex!=-1;adsIndex=edge[adsIndex].pre)
{
tmpMoney = (cur.w-edge[adsIndex].commission) * edge[adsIndex].rate;
if(money[edge[adsIndex].to]==UNCONN||money[edge[adsIndex].to]<tmpMoney)
{
money[edge[adsIndex].to] = tmpMoney;
if(isNotInQueue[edge[adsIndex].to])
{
dq.push(node(edge[adsIndex].to,money[edge[adsIndex].to]));
isNotInQueue[edge[adsIndex].to] = false;
}
cntRelax[edge[adsIndex].to]++;
if(cntRelax[edge[adsIndex].to]>n)//无向图产生了正环
{
return true;
}
if(edge[adsIndex].to==destination&&tmpMoney-mymoney>0.001)//已经比起始点大了
{
return true;
}
}
}
}
return false;
}
int main()
{
int n,m,s;
double v;
int i;
int a,b;
double r1,c1,r2,c2;
while(~scanf("%d%d%d%lf",&n,&m,&s,&v))
{
//读图部分
iniPreList(n);
for(i=0;i<m;i++)
{
scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2);
addDirectedEdge(a,b,r1,c1);
addDirectedEdge(b,a,r2,c2);
}
if(spfa(v,s,s,n))
{
printf("YES\n");
}
else
{
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