제출 #1348007

#제출 시각아이디문제언어결과실행 시간메모리
1348007FIFI_cppTour (BOI25_tou)C++20
0 / 100
1 ms344 KiB
#include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <deque>
#include <fstream>
#include <iterator>
#include <set>
#include <map>
#include <unordered_map>
#include <iomanip>
#include <cctype>
#include <string>
#include <cassert>
#include <set>
#include <bitset>
#include <unordered_set>
#include <numeric>

#define all(a) a.begin(), a.end()
#define fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define pb push_back
#define ppi pair<int,pair<int,int>>
#define int int64_t

using namespace std;
//    /\_/\
//   (= ._.)
//   / >  \>
// encouraging cat
const int INF = 10000000000000000;
//const int mod = 1000000007;
const int mod = 998244353;
const int MAXN = 1e6;
//ifstream fin('xor.in');
//ofstream fout('xor.out');
struct Edge {
    int to, col, index;
};
vector<vector<Edge>> adj;
int vis[MAXN];
map<pair<int,int>, bool> curr_vis;
int vis_col[MAXN];
vector<int> path, ans;
bool found = false;
bool stop = false;
pair<int,int> target = {-1, -1};
void dfs(int node, int col)
{
    for (auto edge: adj[node])
    {
        if (found)
        {
            continue;
        }
        if (edge.col == col)
        {
            continue;
        }
        if (curr_vis[{edge.to, edge.col}])
        {
            found = true;
            stop = false;
            target = {edge.to, edge.col};
            continue;
        }
        if (vis[edge.to] == 2 || edge.col == vis_col[edge.to])
        {
            continue;
        }
        vis[edge.to]++;
        vis_col[edge.to] = edge.col;
        path.pb(edge.index);
        curr_vis[{edge.to, edge.col}] = true;
        dfs(edge.to, edge.col);
        if (!stop)
        {
            ans.pb(path[path.size() - 1]);
        }
        if (edge.to == target.first && edge.col == target.second)
        {
            stop = true;
        }
        curr_vis[{edge.to, edge.col}] = false;
        path.pop_back();
    }
}
signed main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n,m;
        cin >> n >> m;
        adj.clear();
        adj.resize(n);
        vector<Edge> edges(m);
        ans.clear();
        path.clear();
        curr_vis.clear();
        target = {-1, -1};
        found = false;
        stop = false;
        for (int i = 0;i < n;i++)
        {
            vis_col[i] = -1;
            vis[i] = 0;
        }
        for (int i = 0;i < m;i++)
        {
            int u,v,c;
            cin >> u >> v >> c;
            u--,v--;
            adj[u].pb({v, c, i + 1});
            edges[i] = {v, c, i + 1};
        }
        for (int i = 0;i < n;i++)
        {
            if (vis[i] != 2)
            {
                dfs(i, -1);
            }
        }
        if (found)
        {
            cout << "YES" << '\n';
            reverse(all(ans));
            cout << ans.size() << " ";
            for (auto i: ans)
            {
                cout << i << " ";
            }
            cout << '\n';
        }
        else
        {
            cout << "NO" << '\n';
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...