抢红包机器人
已经提交 已经通过
60.00%
Total Submission:30
Total Accepted:18
题目描述
众所周知,camp群里有很多抢红包的机器人,wls对这种号感到很愤怒,他决定把这些机器人全部找出来后踢掉。
wls 研究后发现,由于人的手速是拼不过脚本的,所以如果某个号在某个红包里抢得比某个机器人快,那么这个号肯定也是机器人。
现在 wls 想知道,在群里一定有机器人的情况下,camp 群里至少有几个机器人。
注:机器人并不是每次都会抢红包,而且由于网速问题机器人抢红包的速度也不是固定的,所以有可能有时机器人 a 比 b 快,有时 b 比 a 快。
输入描述
第一行两个正整数 n,mn,m,分别表示群员数量和 wls 发的红包数量
接下来 mm 行,描述这 mm 个红包,每行一开始一个正整数 kk,表示抢了这个红包的人的数量,之后 kk 个互不相同的 [1,n][1,n] 内的正整数,表示按照先后顺序给出了抢这个红包的群员的编号。
输出描述
输出一个整数,表示群里至少有几个机器人
样例输入 1
4 2 3 1 2 3 2 3 1
样例输出 1
1
解析:解一个强连通图
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
vector<int>vec[maxn];
vector<int>e[maxn];
int vis[maxn],cnt;
void dfs(int x){
cnt++;vis[x]=1;
vector<int>::iterator it;
for(it=e[x].begin();it!=e[x].end();it++)
if(!vis[*it])dfs(*it);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b;
cin>>a;
for(int j=0;j<a;j++){
scanf("%d",&b);
vec[i].push_back(b);
}
for(int j=a-1;j>0;j--)
e[vec[i][j]].push_back(vec[i][j-1]);//人不可能比机器人快
}
int ans=inf;
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
cnt=0;dfs(i);
ans=min(ans,cnt);
}
cout<<ans<<endl;
return 0;
}