离散+SPFA差分约束+卡常做法过掉
查看原帖
离散+SPFA差分约束+卡常做法过掉
557682
Jingyan楼主2022/8/28 08:25

代码如下

#include <bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
const int N=2e6+10;
int n,ct;
int dis[N],cnt[N];
bool vis[N];
vector<PII> v[N];
unordered_map<int,int> mp;
int cl;
class node{
    public:

    int x,y,op;
}d[N];
int a[N];

bool SPFA(int s){
    dis[s]=0;
    int mx=0;
    stack<int> q;
    q.emplace(s);
    vis[s]=1;cnt[s]++;
    while(!q.empty()){
        int now=q.top();q.pop();
        vis[now]=0;
        for(auto[v,w]:v[now])
            if(dis[v]>dis[now]+w){
                dis[v]=dis[now]+w;
                if(!vis[v])
                    vis[v]=1,q.emplace(v),cnt[v]++;
                mx=max(mx,cnt[v]);
                if(cnt[v]>=ct)
                    return 0;
            }
        if((double)clock()/CLOCKS_PER_SEC/(double)cl>0.18) 
        {
            if(mx>ct/8000) return 0;
            else return 1;
        }
    }
    return 1;
}

void _main(){
    cl++;
    memset(dis,0x7f,sizeof(dis));
    memset(cnt,0,sizeof(dis));
    memset(vis,0,sizeof(vis));
    mp.clear();

    cin>>n;
    ct=0;
    v[0].clear();
    

    for(int i=1;i<=n;i++)
        cin>>d[i].x>>d[i].y>>d[i].op,
        a[++ct]=d[i].x,a[++ct]=d[i].y;
    
    sort(a+1,a+1+ct);

    ct=unique(a+1,a+1+ct)-a;
    for(int i=1;i<=n;i++)
        d[i].x=lower_bound(a+1,a+ct,d[i].x)-a,
        d[i].y=lower_bound(a+1,a+ct,d[i].y)-a;
    ct--;

    for(int i=1;i<=ct;i++)
        v[i].clear(),v[0].emplace_back(i,0);

    bool flag=1;
    for(int i=1;i<=n;i++){
        if(d[i].op){
            if(d[i].x!=d[i].y)
                v[d[i].x].emplace_back(d[i].y,0),v[d[i].y].emplace_back(d[i].x,0);
        }
        else{
            if(d[i].x==d[i].y)
                flag=0;
            else{
                if(d[i].x>d[i].y)
                    swap(d[i].x,d[i].y);
                v[d[i].x].emplace_back(d[i].y,-1);  
            }
        }
    }
        
    ct++;

    if(flag && SPFA(0))
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);

    int T;
    cin>>T;
    while(T--)
        _main();
    
    return 0;
}
2022/8/28 08:25
加载中...