为什么我BFS判负环直接T飞???
查看原帖
为什么我BFS判负环直接T飞???
250699
mot1ve楼主2020/10/22 16:58

哪里写锅了吗,dfs版本的跑得飞快。

#include<bits/stdc++.h>
using namespace std;
const double INF=1e18;
int n,m,idx;
int head[100010],cnt[100010],vis[1000010];
double dis[100010];
struct node{
    int nxt,to;
    double w;
}edge[1000010];
void add(int u,int v,double w)
{
    edge[++idx].nxt=head[u];
    edge[idx].to=v;
    edge[idx].w=w;
    head[u]=idx;
}
bool spfa(int s,double mid)
{
   for(int i=1;i<=n;i++)
   {
       dis[i]=INF;
       vis[i]=0;
       cnt[i]=0;
   }
   queue<int> q;
   dis[s]=0;
   q.push(s);
   while(q.size())
   {
   	    int x=q.front();
   	    q.pop();
   	    vis[x]=0;
   	    for(int i=head[x];i;i=edge[i].nxt)
   	    {
   	    	int y=edge[i].to;
   	    	if(dis[x]+edge[i].w-mid<dis[y])
   	    	{
   	    		dis[y]=dis[x]+edge[i].w-mid;
   	    		cnt[y]++;
   	    		if(cnt[y]>=n)
   	    		return 1;
   	    		if(!vis[y])
   	    		{
   	    			q.push(y);
   	    			vis[y]=1;
				}
			}
		}
   }
   return 0;
}
bool check(double mid)
{
    for(int i=1;i<=n;i++)
    {
        if(spfa(i,mid))
        return 1;
    }
    return 0;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        double w;
        scanf("%d%d%lf",&u,&v,&w);
        add(u,v,w);
    }
    double l=-10000010,r=10000010;
    while(r-l>1e-9)
    {
        double mid=(l+r)/2.0;
        if(check(mid)) r=mid;
        else l=mid;
    }
    printf("%.8lf",l);
    return 0;
}
2020/10/22 16:58
加载中...