• 【CodeVS 2822】爱在心中


    “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动。爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home。”

    在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况)。爱是具有传递性的,即如果A爱B,B爱C,则A也爱C。
    如果有这样一部分人,他们彼此都相爱,则他们就超越了一切的限制,用集体的爱化身成为一个爱心天使。
    现在,我们想知道在这个爱的国度里会出现多少爱心天使。而且,如果某个爱心天使被其他所有人或爱心天使所爱则请输出这个爱心天使是由哪些人构成的,否则输出-1。

    tarjan缩点后判断一下每个新节点的出度就可以了~

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N = 10003;
    const int M = 50003;
    void read(int &k) {
    	k = 0; int fh = 1; char c = getchar();
    	for(; c < '0' || c > '9'; c = getchar())
    		if (c == '-') fh = -1;
    	for(; c >= '0' && c <= '9'; c = getchar())
    		k = (k << 1) + (k << 3) + c - '0';
    	k = k * fh;
    }
    
    bool vis[N], inst[N];
    struct node {int from, nxt, to;} E[M];
    int DFN[N], low[N], point[N], cnt = 0, col[N], color = 0, st[N], top = 0, n, m, out[N], sum[N];
    void tarjan(int x) {
    	DFN[x] = low[x] = ++cnt;
    	st[++top] = x; vis[x] = inst[x] = 1;
    	for(int tmp = point[x]; tmp; tmp = E[tmp].nxt)
    		if (!vis[E[tmp].to]) tarjan(E[tmp].to), low[x] = min(low[x], low[E[tmp].to]);
    		else if (inst[E[tmp].to]) low[x] = min(low[x], DFN[E[tmp].to]);
    	if (low[x] == DFN[x]) {
    		int u = 0; ++color;
    		while (u != x) {
    			u = st[top--];
    			col[u] = color;
    			inst[u] = 0;
    			++sum[color];
    		}
    	}
    }
    void ins(int x, int y) {E[++cnt] = (node) {x, point[x], y}; point[x] = cnt;}
    int main() {
    	read(n); read(m);
    	int u, v;
    	for(int i = 1; i <= m; ++i) read(u), read(v), ins(u, v);
    	cnt = 0;
    	for(int i = 1; i <= n; ++i) if (!vis[i]) tarjan(i);
    	for(int i = 1; i <= m; ++i) {
    		u = col[E[i].from]; v = col[E[i].to];
    		if (u != v) ++out[u];
    	}
    	int ans = 0, tmp = 0;
    	for(int i = 1; i <= color; ++i) if (sum[i] > 1) ++tmp;
    	for(int i = 1; i <= color; ++i) {
    		if (out[i] == 0) {
    			if (ans != 0 || sum[i] == 1) {ans = 0; break;}
    			else ans = i;
    		}
    	}
    	printf("%d
    ", tmp);
    	if (ans == 0) puts("-1");
    	else {
    		for(int i = 1; i <= n; ++i)
    			if (col[i] == ans)
    				printf("%d ", i);
    	}
    	return 0;
    }
    

    又手残了,药丸~

  • 相关阅读:
    ASP下的URL重写
    经典日历
    asp中使用存储过程
    带进度条的ASP无组件断点续传下载代码
    XML与ASP简单结合实现HTML模板功能
    ASP函数
    CSS垂直树形下拉列表
    ASP无组件上载,带进度条,多文件上载。。
    采用AJAX实现带进度条的文件上传
    Rose与PowerDesigner:两款建模工具对比分析比较
  • 原文地址:https://www.cnblogs.com/abclzr/p/5479195.html
Copyright © 2020-2023  润新知