| ||||||||||
| 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 | |||||||||
Re:我也扔2个spfa的,,,一个是队列的,,,一个dfs的,,,In Reply To:终于AC了!!!附代码!如果大家能给意见,在下感激不尽! Posted by:xiangrui at 2010-03-20 01:13:57 之所以写dfs的,,是因为,,有网上说dfs很快,,结果实在太让人失望了,,慢的要死,,,400多ms,,,队列的才32ms,,,,,
队列&&&&&&&&&&&&&&&&&&&&&&
#include <iostream>
using namespace std;
#define N 510
int p[N],d[N],time[N],q[N];
bool vis[N];
int t,n,m,mm;
struct edge
{
int to,w,next;
}e[N*N];
bool spfa()
{
memset(time,0,sizeof(time));
time[1]++;
int head=-1,tail=0;
q[tail]=1;
while(head!=tail)
{
int u=q[head=(head+1)%n];
vis[u]=false;
for(int x=p[u];x!=-1;x=e[x].next)
{
int v=e[x].to,w=e[x].w;
if(d[v]>d[u]+w)
{
if(v==1)
return true;
d[v]=d[u]+w;
if(!vis[v])
{
q[tail=(tail+1)%n]=v;
vis[v]=true;
time[v]++;
if(time[v]>n)
return true;
}
}
}
}
return false;
}
int main()
{
for(cin>>t;t--;)
{
scanf("%d%d%d",&n,&m,&mm);
int i,j=0;
memset(p,-1,sizeof(p));
int from,to,w;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&from,&to,&w);
e[j].to=to;e[j].w=w;e[j].next=p[from];p[from]=j++;
e[j].to=from;e[j].w=w;e[j].next=p[to];p[to]=j++;
}
for(i=1;i<=mm;i++)
{
scanf("%d%d%d",&from,&to,&w);
e[j].to=to;e[j].w=0-w;e[j].next=p[from];p[from]=j++;
}
memset(vis,false,sizeof(vis));
for(i=1;i<=n;i++)
d[i]=INT_MAX;
d[1]=0;
vis[1]=true;
if(spfa())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
dfs,,,就换了一个函数....
bool spfa(int s)
{
for(int x=p[s];x!=-1;x=e[x].next)
{
int v=e[x].to,w=e[x].w;
if(d[v]>d[s]+w)
{
if(vis[v])
return true;
vis[v]=true;
d[v]=d[s]+w;
if(spfa(v))
return true;
vis[v]=false;
}
}
return false;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator