zoukankan      html  css  js  c++  java
  • SPFA判负环

    #include <bits/stdc++.h>
    using namespace std;
    vector<long long> p[2][10007];
    long long dis[10007];
    int d[250000007];
    bool pd[10007];
    int num[10007];
    int n,m;
    bool SPFA(int s)
    {
    	memset(num,0,sizeof(num));
    	memset(dis,63,sizeof(dis));
    	//memset(pd,0,sizeof(pd));
    	int h=1,t=1;
    	d[1]=s;num[s]=0;
    	dis[s]=0;pd[s]=1;
    	bool flag=0;
    	while(h<=t)
    	{
    		int x=d[h];
    		pd[d[h]]=0;++h;
    		for(int i=0;i<p[0][x].size();++i)
    		{
    			long long k=p[0][x][i],v=p[1][x][i];
    			if(dis[k]>dis[x]+v)
    			{
    				dis[k]=dis[x]+v;
    				num[k]=num[x]+1;
    				if(num[x]>n)
    				  return true;
    				if(pd[k])  continue;
    				pd[k]=1;
    				d[++t]=k;
    			}
    		}
    	}
    	return false;
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=m;++i)
    	{
    		int x,y;
    		long long v;
    		scanf("%d%d%lld",&x,&y,&v);
    		p[0][x].push_back(y);
    		p[1][x].push_back(v);
    		p[0][y].push_back(x);
    		p[1][y].push_back(v);
    	}
    	for(int i=1;i<=n;++i)
    	{
    		p[0][0].push_back(i);
    		p[1][0].push_back(0);
    	}
    	if(SPFA(0))
    	{
    		cout<<"yes";
    		return 0;
    	}
    	cout<<"no";
    	return 0;
    }
    
  • 相关阅读:
    树上差分
    循环数组最大子段和(带限制的最大子段和,单调队列优化)
    sprintf函数的用法详解
    VBS基础篇
    VBS基础篇
    VBS基础篇
    VBS基础篇
    VBS基础篇
    Android随笔
    Android随笔
  • 原文地址:https://www.cnblogs.com/org0/p/13968571.html
Copyright © 2011-2022 走看看