1 条题解

  • 2

    tarjan做法:

    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <ctime>
    #include <fstream>
    #include <iomanip>
    #include <iostream>
    #include <queue>
    #include <set>
    #include <stack>
    #include <string>
    #include <vector>
    #define LL long long
    #define uLL unsigned long long
    using namespace std;
    const int N = 1e5 + 5;
    const int INF = 0x3f3f3f3f;
    int T, m, n, pos, sum, id, cnt, tot, top, st[N], num[N], col[N], vis[N], low[N], dfn[N], to[N], ne[N], head[N], a[N], b[N];
    bool flag;
    void add(int x, int y){
        to[++id] = y, ne[id] = head[x], head[x] = id;
    }
    void init(){
    	pos = sum = id = cnt = tot = top = 0;
    	memset (st, 0, sizeof(st));
    	memset (num, 0, sizeof(num));
    	memset (col, 0, sizeof(col));
    	memset (vis, 0, sizeof(vis));
    	memset (dfn, 0, sizeof(dfn));
    	memset (to, 0, sizeof(to));
    	memset (ne, 0, sizeof(ne));
    	memset (head, 0, sizeof(head));
    	memset (a, 0, sizeof(a));
    	memset (b, 0, sizeof(b));
    }
    void tarjan(int u, int no_x, int no_y){
        st[++top] = u, vis[u] = 1, dfn[u] = low[u] = ++cnt;
        for (int i = head[u]; i; i = ne[i]){
            int v = to[i];
            if (v == no_y && no_x == u)
            	continue;
            if (!dfn[v]){
                tarjan(v, no_x, no_y);
                low[u] = min(low[u], low[v]);
            }
            else if (vis[v])
                low[u] = min (low[u], dfn[v]);
        }
        if (dfn[u] == low[u]){
            tot++;
            while (1){
                vis[ st[top] ] = 0, num[tot]++, col[ st[top] ] = tot, top--;
                if (st[top + 1] == u)
                    break;
            }
        }
    }
    int main(){
    	cin >> T;
    	while (T--){
    		init();
    		cin >> n >> m;
    		flag = 1;
    		for (int i = 1; i <= m; i++){
    		    cin >> a[i] >> b[i];
    		    add(a[i], b[i]);
    		}
    		for (int j = 1; j <= m; j++){
    			for (int i = 1; i <= n; i++)
    			    if (!dfn[i])
    			        tarjan(i, a[j], b[j]);
    		}
    		for (int i = 1; i <= m; i++)
    		    if (col[ a[i] ] != col[ b[i] ]){
    		    	cout << "YES\n";
    		    	flag = 0;
    		    	break;
    		    }
    		if (flag)
    			cout << "NO\n"; 
    	}
        return 0;
    }
    
    • 1

    信息

    ID
    2310
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    183
    已通过
    21
    上传者