Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:求路过的大侠帮忙看看spfa错哪了

Posted by hzl88888888 at 2012-07-04 16:17:11 on Problem 1860
In Reply To:求路过的大侠帮忙看看spfa错哪了 Posted by:hataksumo at 2012-07-04 13:08:42
> #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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator