1 条题解

  • 0
    @ 2025-2-14 21:30:06

    C++ :

    #include<cstdio>
    #include<cstring>
    #define N 1005
    #define M 5005
    using namespace std;
    
    inline int read()
    {
        int x=0;char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x;
    }
    
    int n,m,tot;
    int f[N],line[N]; 
    bool flag,mark[N];
    double dis[N];
    
    struct data{
    	int to;
    	int next;
    	int t;//权值 
    	double v;
    }e[M];
    
    void insert(int u,int v,int w)
    {
    	e[++tot].to=v;
    	e[tot].next=line[u];
    	line[u]=tot;
    	e[tot].t=w;
    }
    
    void rebuild(double x)
    {
         for(int i=1;i<=n;i++)
         {
         	for(int j=line[i];j!=0;j=e[j].next)
         	{
         		 e[j].v=e[j].t*x-f[e[j].to];
    		}
    	 }
             
    }
    void spfa(int x)
    {
         mark[x]=1;
         
         for(int i=line[x];i!=0;i=e[i].next)
         {
         	if(e[i].v+dis[x]<dis[e[i].to])
            {
                if(mark[e[i].to])
    			{
    				flag=1;
    				return;
    			}
                else
                {
                      dis[e[i].to]=e[i].v+dis[x];
                      spfa(e[i].to);
                }
            }
    	 }
             
         mark[x]=0;
    }
    
    bool jud()//判断是否有负环 
    {
         for(int i=1;i<=n;i++)	dis[i]=mark[i]=0;
         flag=0;
         for(int i=1;i<=n;i++)
         {
    	 	spfa(i);
    		if(flag)	return 1;
    	}
         return 0;
    }
    
    int main()
    {
        n=read();
    	m=read();
        for(int i=1;i<=n;i++)	f[i]=read();
        
        for(int i=1;i<=m;i++)
        {
            int u=read(),v=read(),w=read();
            insert(u,v,w);
        }
        
        double l=0,r=10000;
        
        while(r-l>0.001)
        {
            double mid=(l+r)/2;
            rebuild(mid);
            if(jud())l=mid;
            else r=mid;
        }
        
        printf("%.2lf",l);
        return 0;
    }
    
    
    • 1

    信息

    ID
    957
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者