演算法複習 - AcWing - 資料結構

小松萘發表於2020-10-04

237. 程式自動分析

一開始用種類並查集調了半天,,,但是這並不是要分為兩類啊喂!

A!=B,  B!=C 不能推出A=C

因為是離線,正確的思路:
(0)資料太大,離散化
(1)先把已知的相等情況處理完
(2)對於不相等的情況,如果他們已經在同一個並查集裡,則出錯

int f[MX];
vector<pair<int,pair<int,int>>>v;
int find(int x)
{
    return x==f[x]?x:f[x]=find(f[x]);
}
void solve()
{
    int n;cin>>n;
    v.clear();
    vector<int>tmp;
    rpp(i,n) 
    {
        int x,y,z;cin>>x>>y>>z;
        v.push_back(make_pair(1-z,make_pair(x,y)));
        tmp.push_back(x),tmp.push_back(y);
    }
    map<int,int>id;
    int cnt=0;
    for(auto x:tmp) 
    {
        if(id[x]) continue;
        id[x]=++cnt;
    }
    n=cnt;

    sort(all(v));
    
    int flag=0;
    rpp(i,n) f[i]=i; 
    for(auto op:v)
    {
        int x=id[op.second.first],y=id[op.second.second],z=op.first;
        int fx=find(x),fy=find(y);
        if(z==0) f[fx]=fy;
        else if(fx==fy) {flag=1;break;}
    }
    if(!flag) cout<<"YES\n";
    else cout<<"NO\n";
}

相關文章