Submission #1361129

#TimeUsernameProblemLanguageResultExecution timeMemory
1361129AlmontherTour (BOI25_tou)C++20
0 / 100
4 ms344 KiB
#include<bits/stdc++.h>

using namespace std;

#define ll long long
const int maxn=1e6+5;
ll n,m;
vector<array<ll,3>>v[maxn];
vector<pair<ll,ll>>path,nodes;
vector<ll>ans;
ll vis1[maxn],vis[maxn];
void dfs(ll x,ll last){
    if(vis1[x]==-1||vis1[x]==last) return;
    if(ans.size()) return;
    if(vis[x]==3){
        while(path.back().first!=x){
            ans.push_back(path.back().second);
            path.pop_back();
        }
        ans.push_back(path.back().second);
        path.pop_back();
        while(path.back().first!=x){
            ans.push_back(path.back().second);
            path.pop_back();
        }
        ans.push_back(path.back().second);
        return;
    }
    vis[x]++;
    nodes.push_back({x,last});
    for(auto [to,col,id]:v[x]){
        if(col==last) continue;
        path.push_back({x,id});
        dfs(to,col);
        path.pop_back();
        if(ans.size()) return;
    }
    vis[x]--;
}
void dfs1(ll x,ll last){
    if(vis[x]==1||ans.size()) return;
    vis[x]=2;
    for(auto [to,col,id]:v[x]){
        if(col==last) continue;
        if(ans.size()) return;
        path.push_back({x,id});
        vis1[x]=col;
        if(vis1[to]!=col&&vis[to]==2){
            while(path.back().first!=to){
                ans.push_back(path.back().second);
                path.pop_back();
            }
            ans.push_back(path.back().second);
        }
        else if(vis[to]==0) dfs1(to,col);
        path.pop_back();
        if(ans.size()) return;
    }
    vis[x]=1;
}
void solve(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        ll a,b,c;
        cin>>a>>b>>c;
        v[a].push_back({b,c,i});
    }
    for(int i=1;i<=n;i++){
        dfs1(i,0);
        if(ans.size()){
            reverse(ans.begin(),ans.end());
            cout<<"YES\n"<<ans.size()<<' ';
            for(auto i:ans) cout<<i<<' ';
            cout<<'\n';
            ans.clear();
            for(int i=0;i<=n;i++){
                v[i].clear();
                vis[i]=vis1[i]=0;
            }
            path.clear();
            return;
        }
    }
    for(int i=0;i<=n;i++) vis[i]=vis1[i]=0;
    for(int i=1;i<=n;i++){
        dfs(i,0);
        for(auto [x,col]:nodes){
            if(vis1[x]==0) vis1[x]=col;
            else vis1[x]=-1;
        }
        path.clear();
        nodes.clear();
    }
    if(ans.size()){
        reverse(ans.begin(),ans.end()); 
        map<ll,ll>mp;
        for(auto i:ans){
            if(mp[i]==1){
                while(ans.back()!=i) ans.pop_back();
                ans.pop_back();
                break;
            }
            mp[i]++;
        }
        cout<<"YES\n"<<ans.size()<<' ';
        for(auto i:ans) cout<<i<<' ';
        cout<<'\n';
        ans.clear();
    }
    else cout<<"NO\n";
    for(int i=0;i<=n;i++){
        v[i].clear();
        vis[i]=vis1[i]=0;
    }
}

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    int _=1;
    cin>>_;
    while(_--) solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...