Vijos Victoria的舞会3

描述

Victoria是一位颇有成就的艺术家,他因油画作品《我爱北京天安门》闻名于世界。现在,他为了报答帮助他的同行们,准备开一个舞会。

Victoria准备邀请n个已经确定的人,可是问题来了:
这n个人每一个人都有一个小花名册,名册里面写着他能够通知到的人的名字。比如说在A的人名单里写了B,那么表示A能够通知到B;但是B的名单里不见的有A,也就是说B不见得通知到A。

Victoria觉得需要确定自己需要通知多少个人m,能够实际将所有人n都通知到。并求出一种方案以确定m的最小值是多少。

注意:自己的名单里面不会有自己的名字。Victoria可以自身通知到所有n个人。

格式

输入格式

第一行一个数n。接下来n行,每i+1行表示编号为i的人的小花名册名单,名单以0结束。\

1<=n<=200。

输出格式

一个数,m。

样例1

样例输入1

18
0
11 0
0
0
0
16 0
14 0
0
0
0
2 13 0
0
11 0
7 0
0
6 0
0
0

Copy

样例输出1

14

Copy

限制

各个测试点1s

 1 /*
 2     一个tarjan裸题
 3     不过不能只求强连通分量的个数
 4     如果有 A 可以通知 B 而 B 无法通知 A
 5     那么ans就会加两次
 6     只需要建新图 统计出入度就好了
 7 */
 8 #include<cstdio>
 9 #include<iostream>
10 #define MAXN 1000
11
12 using namespace std;
13
14 int n,in[MAXN],ans;
15
16 int dfn[MAXN],low[MAXN],stack[MAXN],belong[MAXN],inr,cnt,top;
17 bool vis[MAXN];
18
19 struct node {
20     int to;
21     int next;
22 };
23 node e[MAXN*10];
24
25 int head[MAXN],tot;
26
27 inline void read(int&x) {
28     x=0;int f=1;char c=getchar();
29     while(c>‘9‘||c<‘0‘) {if(c==‘-‘) f=-1;c=getchar();}
30     while(c>=‘0‘&&c<=‘9‘) {x=(x<<1)+(x<<3)+c-48;c=getchar();}
31     x=x*f;
32 }
33
34 inline void add(int x,int y) {
35     e[++tot].to=y;
36     e[tot].next=head[x];
37     head[x]=tot;
38 }
39
40 inline void tarjan(int u) {
41     dfn[u]=low[u]=++inr;
42     vis[u]=true;
43     stack[++top]=u;
44     for(int i=head[u];i;i=e[i].next) {
45         int v=e[i].to;
46         if(!dfn[v]) {
47             tarjan(v);
48             low[u]=min(low[u],low[v]);
49         }
50         else if(vis[v]) low[u]=min(low[u],dfn[v]);
51     }
52     if(dfn[u]==low[u]) {
53         ++cnt;
54         int t;
55         do {
56             t=stack[top--];
57             vis[t]=false;
58             belong[t]=cnt;
59         }while(u!=t);
60     }
61 }
62
63 int main() {
64     int x;
65     read(n);
66     for(int i=1;i<=n;i++) {
67         while(1) {
68             read(x);
69             if(!x) break;
70             else add(i,x);
71         }
72     }
73     for(int i=1;i<=n;i++)
74       if(!dfn[i])
75         tarjan(i);
76     for(int i=1;i<=n;i++)
77       for(int j=head[i];j;j=e[j].next) {
78             int v=e[j].to;
79           if(belong[i]!=belong[v])
80             in[belong[v]]++;
81       }
82     for(int i=1;i<=cnt;i++)
83       if(in[i]==0) ans++;
84     printf("%d\n",ans);
85     return 0;
86 }

代码

时间: 2024-10-12 15:23:45

Vijos Victoria的舞会3的相关文章

COGS 1051. [Vijos1021] Victoria的舞会1

1051. [Vijos1021] Victoria的舞会1 #include<bits/stdc++.h> using namespace std; #define maxn 2333 int n,m,x,num[maxn<<3],ans; char ch; inline void read(int &now) { ch=getchar(); now=0; while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'

COGS 1052. [Vijos1022] Victoria的舞会2

1052. [Vijos1022] Victoria的舞会2 并查集吧... #include<bits/stdc++.h> using namespace std; #define maxn 1000000 #define maxm 2333 int n,m,ans,fa[maxn],x,a[maxm][maxm]; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } int main() { freopen("vict

VJ 1021 Victoria的舞会1

描述 Victoria是一位颇有成就的艺术家,他因油画作品<我爱北京天安门>闻名于世界.现在,他为了报答帮助他的同行们,准备开一个舞会. Victoria准备邀请n个已经确定的人,可是问题来了: 这n个人每一个人都有一个小花名册,名册里面写着他所愿意交流的人的名字.比如说在A的人名单里写了B,那么表示A愿意与B交流:而且如果A名单里面有B,那么B名单里面肯定有A,也就是说两个人如果一方愿意和另一方交流,那么另一方也肯定愿意和这一方交流. Victoria觉得需要在这n个人里面确定m个人,保证这

Vijos P1061 迎春舞会之三人组舞 DP

题目链接:https://vijos.org/p/1061 n个人选出3*m人,排成m组,每组3人. 站的队形——较矮的2个人站两侧,最高的站中间. 从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低. 计算公式为 h=(a-b)^2 (a.b为较矮的2人的身高)现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低; input: 第一排为m,n. 第二排n个数字,保证升序排列. 思路:由于和中间高的人无关,但是每次选旁边两个的时候,会由于没有比这

Vijos P1062 迎春舞会之交谊舞

题目链接:https://vijos.org/p/1062 题意:输入n(n <= 1500)个女生左边有多少个男生.每个女生都和她左边最近的男生跳舞. 输出每个女生到可以与之跳舞的男生之间有几个男生;(包括跳舞的男生) input 64 5 6 6 6 6output 1 1 1 4 5 6 思路:简单的递推即可:并没有用到栈..对于第i个女生,易知当该女生左边男生的数量比前一个女生的数量多时,结果就是1.但是当出现连续的相等时,即表示这些女生之前没有男生,这时我们就需要先前找"可用&q

VIJOS:P1706(舞会)

描述 Arthur公司是一个等级森严的公司,它们有着严格的上司与下属的关系,公司以总裁为最高职位,他有若干个下属,他的下属又有若干个下属,他的下属的下属又有若干个下属……现接近年尾,公司组织团拜活动,活动中有一部分是自由舞会,公司的每个职员都有一个搞笑值,现要你制定一套哪些人上台的方案,使得台上所有演员的搞笑值最大.当然,职员们是不会和他们的顶头上司一起上台的. 格式 输入格式 第一行一个整数N,表示这个公司总共的职员个数. 接下来一行有N个整数,由空格隔开,第i个整数表示职员i的搞笑值Ai(-

【模拟】Vijos P1062 迎春舞会之交谊舞

题目链接: https://vijos.org/p/1062 题目大意: 一群男女站成一排,一男一女配对,女的只找左边第一个空闲的男生,给定前n个女生左边的额男生个数,问前n个女生到男伴之间共有几个男生.(n<=1500 女生左侧男生231内) 题目思路: [模拟] 每个女生只找左边的最靠近的闲置男生,所以每当女生左边的男生数变化的时候就说明队伍里加入了新的男生,而这些男生只会影响右侧的女生. 所以我一开始想到,把男生分成好多群,加入一个女生完把最靠近她的男生群最右的男生配对给这个女生,然后该男

Vijos P1063 迎春舞会之交谊舞 DP

题目链接:https://vijos.org/p/1063 题意:有n(n <= 100)行,每行有2*i-1个可显字符'#'与'-',组成一个倒三角形,问由'-'组成的最大三角形的'-'的个数为多少? 思路:顶点为倒三角,即行列奇偶相同:对于一个顶点可以扩展的最大边长首先需要上面三角为'-',这样只需建立在顶点上一行的左右两个点的最大边长即可: 三角形个数就是边长的平方: ps:开始我想的是从列的角度看轴线的左右两边的min,然后模拟行.真是醉了. #include<iostream>

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734