疑问
  • 板块灌水区
  • 楼主wo_hen_la
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/9/5 13:40
  • 上次更新2023/11/2 22:41:19
查看原帖
疑问
794701
wo_hen_la楼主2023/9/5 13:40

为什么这段代码做负环模板,不加vis[]比加了还快一点点

#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
const long long INF=2147483647;
int vis[maxn];
int cnt[maxn];
int dis[maxn];
int n,m,s;
struct node{
    int s1;
    int side;
};
vector<node>mp[maxn];
int Spfa(int s){
    queue<int>v;   
    vis[s]=1;
    v.push(s);
    dis[s]=0;
    while(!v.empty()){
        int q=v.front();
        v.pop();

        vis[q]=0;
        for (int i=0;i<mp[q].size();i++){
            if (dis[mp[q][i].s1]>dis[q]+mp[q][i].side){
                vis[mp[q][i].s1]=0;
                cnt[mp[q][i].s1]++;
                if(cnt[mp[q][i].s1]>=n) return 1;
                dis[mp[q][i].s1] = dis[q] + mp[q][i].side;
                if(vis[mp[q][i].s1]) continue;
                v.push(mp[q][i].s1);      
            }

        }
    }
    return 0;
}
int main()
{
    int x,y,r,t;
    cin>>t;
    while(t--){
        memset(dis,63,sizeof(dis));
        memset(vis,0,sizeof(vis));
        memset(cnt,0,sizeof(cnt));
        memset(mp,0,sizeof(mp));
        cin>>n>>m;
        while(m--){
            node h;
            cin>>x>>y>>r;
            if(r>=0){
                h.s1=y;
                h.side=r;
                mp[x].push_back(h);
                h.s1=x;
                h.side=r;
                mp[y].push_back(h);
            }
            else{
                h.s1=y;
                h.side=r;
                mp[x].push_back(h);
            }

        }
        if(Spfa(1)) cout<<"YES\n";
        else cout<<"NO\n";
    }
} 
2023/9/5 13:40
加载中...