zoukankan      html  css  js  c++  java
  • 负环操作 的队列

    说明

    (今天又用双端队列写了一个别的spfa题,也有负环操作,是可以过的,所以就是说用双端队列其实跟队列是一样的,都能判出负环,我觉得可能不用太在意什么队列了吧,但是这道洛谷题用双端队列会出问题,所以要用queue,可能是题目的原因)
    --2020.7.16修改
    (我发现,用双端队列常数较大,所以在做某些差分约束题的时候,若判断能否成立(负环),最好用queue,deque的常数可能会超时例如·洛谷·「P1993小K的农场」)
    --2020.7.19修改

    「模板」负环

    • 不要deque,否则会出错(不知道什么原因),就是可能会多判负环
    • 用queue是正常的
    • 自己的出错数据
    • 正确答案为:NO(应该是无负环)

    Code

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    using namespace std;
    const int maxn=2e3+5,maxm=6e3+5;
    int n,m,head[maxn],dis[maxn],cnt[maxn],cc;
    struct Edge{int to,next,val;}e[maxm];
    bool vis[maxn];
    void A(int x,int y,int z){
    	e[++cc].to=y;
    	e[cc].next=head[x];
    	e[cc].val=z;
    	head[x]=cc;
    }
    void Init(){
    	cc=0;
    	memset(head,0,sizeof head);
    	memset(e,0,sizeof e);
    	memset(cnt,0,sizeof cnt);
    	memset(vis,0,sizeof vis);
    }
    bool spfa(int s){
    	for(int i=1;i<=n;++i)dis[i]=0x3f3f3f3f;
    	queue<int>q;
    	dis[s]=0;vis[s]=1;q.push(s);
    	while(!q.empty()){
    		int x=q.front();q.pop();vis[x]=0;
    		for(int i=head[x];i;i=e[i].next){
    			int y=e[i].to;
    			if(dis[y]>dis[x]+e[i].val){
    				dis[y]=dis[x]+e[i].val;
    				if(!vis[y]){
    					if(++cnt[y]>n){
    						return 1;
    					}
    					vis[y]=1;
    					q.push(y);
    				}
    			}
    		}
    	}
    	return 0;
    }
    int main(){
    //	freopen("1.in","r",stdin);
    	int t;scanf("%d",&t);
    	while(t--){
    		Init();
    		scanf("%d%d",&n,&m);
    		for(int i=1,x,y,z;i<=m;++i){
    			scanf("%d%d%d",&x,&y,&z);
    			if(z>=0)A(x,y,z),A(y,x,z);
    			else A(x,y,z);
    		}
    		if(spfa(1))printf("YES
    ");
    		else printf("NO
    ");
    	}
    	return 0;
    }
    

    正确答案:

    NO
    

    我用deque却跑出来是yes......
    数据

  • 相关阅读:
    POJ 1113 Wall
    POJ 2159 Ancient Cipher
    POJ 3253 Fence Repair
    HDU 5444 Elven Postman
    HDU 5432 Pyramid Split
    数据库 组合查询
    数据库 简单的数据查询
    数据库 聚合函数与分组
    数据库 使用DML语句更改数据
    数据库的数据完整性
  • 原文地址:https://www.cnblogs.com/Lour688/p/13280923.html
Copyright © 2011-2022 走看看