CCPC-Wannafly Winter Camp Day7 (Div2, onsite) G 抢红包机器人 强连通图

抢红包机器人

已经提交 已经通过

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;
}

猜你喜欢

转载自blog.csdn.net/mlm5678/article/details/88550145