2 条题解
-
0
有一些类似于拓扑排序的做法
思路
注意到如果一个奶牛朋友圈只剩下一头奶牛未被邀请,那么他也会被邀请,我们尝试在邀请一头时访问所有他所在的奶牛朋友圈,并将他删去,若此朋友圈只剩下一头奶牛,那么把他邀请即可。整个过程用BFS即可。
AC代码
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; vector<int>G[N]; set<int>s[N]; bool v[N]; int main() { int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int l;scanf("%d",&l); for(int j=1,x;j<=l;j++) { scanf("%d",&x); s[i].insert(x); G[x].push_back(i); } } int ans=0; queue<int>Q;Q.push(1); while(!Q.empty()) { int x=Q.front();Q.pop(); if(v[x])continue; v[x]=1;ans++; for(int i:G[x]) { s[i].erase(x); if(s[i].size()==1)Q.push(*s[i].begin()); } } printf("%d\n",ans); return 0; } -
0
by hansang:
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; set<int> S[N]; queue<int> Q; bool v[N]; vector<int> G[N]; int main(){ int n, m; scanf("%d%d", &n, &m); for(int i=1; i<=m; i++){ int x; scanf("%d", &x); for(int j=1; j<=x; j++){ int d; scanf("%d", &d); S[i].insert(d); G[d].push_back(i); } } memset(v, 0, sizeof(v)); Q.push(1); v[1]=1; int ans=1; while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int y: G[x]){ S[y].erase(x); if(S[y].size()==1){ auto it=S[y].begin(); if(v[*it]) continue; Q.push(*it); v[*it]=1; ans++; } } } printf("%d\n", ans); return 0; }
- 1
信息
- ID
- 2631
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 53
- 已通过
- 18
- 上传者