| ||||||||||
| 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-204K 0ms对spfa有深入理解了,判断是否含有源点的正权回路,因为各个边的权大小直接或间接取决于源点的权值,如果有正权回路,那么一定会与源点连通。
#include <stdio.h>
#include <memory.h>
#include <queue>
#define MAXV 101
using namespace std;
typedef struct
{ int start,end;
double rate,comm;
int next;
}Edge;
Edge de[2001];
int headlist[MAXV],vexnum,edgenum;
int Enter[MAXV],visited[MAXV];
double dis[MAXV];
void Insert(int a,int b,double a1,double a2)
{ de[edgenum].start=a;
de[edgenum].end=b;
de[edgenum].rate=a1;
de[edgenum].comm=a2;
de[edgenum].next=headlist[a];
headlist[a]=edgenum;
edgenum++;
}
bool spfa(int k,double V)
{ queue<int>q;
int i,temp,x,y;
double t;
q.push(k);
dis[k]=V,visited[k]=1;
while(!q.empty())
{ temp=q.front();
q.pop();
visited[temp]=0;
for(i=headlist[temp];i!=-1;i=de[i].next)
{ x=de[i].start,y=de[i].end;
if(dis[y]<(t=(double)(dis[x]-de[i].comm)*de[i].rate))
{ dis[y]=t;
if(!visited[y])
{ visited[y]=1;
q.push(y);
Enter[y]++;
if(Enter[y]>=vexnum)
return true;
}
}
}
}
return false;
}
int main()
{ int N,M,S;
double V;
int a,b;
double a1,b1,a2,b2;
while(scanf("%d %d %d %lf",&N,&M,&S,&V)!=EOF)
{ vexnum=N,edgenum=0;
memset(headlist,-1,sizeof(headlist));
memset(dis,0,sizeof(dis));
memset(visited,0,sizeof(visited));
memset(Enter,0,sizeof(Enter));
while(M--)
{ scanf("%d %d %lf %lf %lf %lf",&a,&b,&a1,&b1,&a2,&b2);
Insert(a,b,a1,b1);
Insert(b,a,a2,b2);
}
if(spfa(S,V)==true) puts("YES");
else puts("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