CodeVS 2822 爱在心中

Description

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

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

 

Input

第1行,两个数N、M,代表爱的国度里有N个人,爱的关系有M条。

第2到第M+1行,每行两个数A、B,代表A爱B。
 
Output
第1行,一个数,代表爱的国度里有多少爱心天使。
第2行,如果某个爱心天使被其他所有人和爱心天使所爱则请输出这个爱心天使是由哪些人构成的(从小到大排序),否则输出-1。
 
Sample Input
 
#1:
6 7
1 2
2 3
3 2
4 2
4 5
5 6
6 4

#2:
3 3
1 2
2 1
2 3
 
Sample Output
#1:
2
2 3
 
#2:
1
-1
Tarjan裸题...但求的东西挺有意思的,题面也很不错(然而没有数据范围......黑心出题人..);
第一问直接找点数>1的联通分量的数量;
第二问的话没有像隔壁wyx那样重新建一次边...而是统计了一下缩点后每个点的出度,因为跑完Tarjan之后是有向无环图,根据题意,第二问的答案必是出度为0且唯一的一个出度为0的点,根据这个可以判断是否有解,当然也要判断一下那个点是不是爱心天使;
代码:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<stack>
 5 using namespace std;
 6 
 7 const int maxn = 100000 + 5;
 8 struct Edge {
 9     int f, t;
10 }gra[maxn];
11 int n, m, u, dcnt, scnt, out;
12 int fir[maxn], nxt[maxn], outdeg[maxn];
13 int dfn[maxn], low[maxn], scc[maxn], sccz[maxn];
14 stack<int>S;
15 void Tarjan(int);
16 
17 int main()
18 {
19     memset(fir, -1, sizeof(fir));
20     scanf("%d%d", &n, &m);
21     for(int i = 1; i <= m ; i++) {
22         int f, t;
23         scanf("%d%d", &f, &t);
24         gra[++u] = (Edge){f, t};
25         nxt[u] = fir[f], fir[f] = u;
26     }
27     for(int i = 1; i <= n; i++)
28         if(!dfn[i]) Tarjan(i);
29     int ans = 0;
30     for(int i = 1; i <= scnt; i++)
31         if(sccz[i] > 1) ans++;
32     cout << ans << endl;
33     for(int i = 1; i <= n; i++)
34         for(int j = fir[i]; ~j; j = nxt[j]) {
35             int tmp = gra[j].t;
36             if(scc[i] != scc[tmp]) outdeg[scc[i]]++;
37         }
38     ans = 0;
39     for(int i = 1; i <= scnt; i++)
40         if(!outdeg[i]) ans = i, out++;
41     if(out > 1||sccz[ans] <= 1) {
42         puts("-1");
43         return 0;
44     }
45     for(int i = 1; i <= n; i++)
46         if(scc[i] == ans) printf("%d ", i);
47     return 0;
48 }
49 
50 void Tarjan(int k)
51 {
52     S.push(k);
53     dfn[k] = low[k] = ++dcnt;
54     for(int i = fir[k]; ~i; i = nxt[i]) {
55         int tmp = gra[i].t;
56         if(!dfn[tmp]) {
57             Tarjan(tmp);
58             low[k] = min(low[k], low[tmp]);
59         }
60         else if(!scc[tmp]) low[k] = min(low[k], dfn[tmp]);
61     }
62     if(dfn[k] == low[k]) {
63         scnt++;
64         while(!S.empty()) {
65             int tmp = S.top();
66             S.pop();
67             scc[tmp] = scnt;
68             sccz[scnt]++;
69             if(tmp == k) break;
70         }
71     }
72 }

转载于:https://www.cnblogs.com/DreifxP/p/7763805.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蛋白质是生物体中普遍存在的一类重要生物大分子,由天然氨基酸通过肽键连接而成。它具有复杂的分子结构和特定的生物功能,是表达生物遗传性状的一类主要物质。 蛋白质的结构可分为四级:一级结构是组成蛋白质多肽链的线性氨基酸序列;二级结构是依靠不同氨基酸之间的C=O和N-H基团间的氢键形成的稳定结构,主要为α螺旋和β折叠;三级结构是通过多个二级结构元素在三维空间的排列所形成的一个蛋白质分子的三维结构;四级结构用于描述由不同多肽链(亚基)间相互作用形成具有功能的蛋白质复合物分子。 蛋白质在生物体内具有多种功能,包括提供能量、维持电解质平衡、信息交流、构成人的身体以及免疫等。例如,蛋白质分解可以为人体提供能量,每克蛋白质能产生4千卡的热能;血液里的蛋白质能帮助维持体内的酸碱平衡和血液的渗透压;蛋白质是组成人体器官组织的重要物质,可以修复受损的器官功能,以及维持细胞的生长和更新;蛋白质也是构成多种生理活性的物质,如免疫球蛋白,具有维持机体正常免疫功能的作用。 蛋白质的合成是指生物按照从脱氧核糖核酸(DNA)转录得到的信使核糖核酸(mRNA)上的遗传信息合成蛋白质的过程。这个过程包括氨基酸的活化、多肽链合成的起始、肽链的延长、肽链的终止和释放以及蛋白质合成后的加工修饰等步骤。 蛋白质降解是指食物中的蛋白质经过蛋白质降解酶的作用降解为多肽和氨基酸然后被人体吸收的过程。这个过程在细胞的生理活动中发挥着极其重要的作用,例如将蛋白质降解后成为小分子的氨基酸,并被循环利用;处理错误折叠的蛋白质以及多余组分,使之降解,以防机体产生错误应答。 总的来说,蛋白质是生物体内不可或缺的一类重要物质,对于维持生物体的正常生理功能具有至关重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值