3 条题解
-
0
#include <bits/stdc++.h> using namespace std; int n,m; int f[2010]; int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } void merge(int x,int y){ int fx=find(x); int fy=find(y); if(fx!=fy){ f[fx]=fy; } } int main(){ cin>>n>>m; for(int i=1;i<=2*n;i++){ f[i]=i; } char c; int x,y; for(int i=1;i<=m;i++){ cin>>c>>x>>y; if(c=='F') merge(x,y); else{ merge(y+n,x); merge(x+n,y); } } int r=0; for(int i=1;i<=n;i++){ if(f[i]==i) r++; } cout<<r; return 0; }
-
0
本题依然是并查集的应用,敌人的敌人是朋友,那么对于p和q这一对敌人来说,我们也要分别把p和q与他们的敌人进行集合的合并。因此可以采用一个vector存储好每个人的敌人是谁,朋友的话不需要过多处理直接join即可
#include<bits/stdc++.h> using namespace std; int n,m,p,q,fa[1005]; char opt; vector<int> e[1005]; int find(int x) { if(x!=fa[x]) { fa[x]=find(fa[x]); } return fa[x]; } void join(int x,int y) { x=find(x); y=find(y); fa[x]=y; return ; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++) { cin>>opt>>p>>q; if(opt=='E') { e[p].push_back(q); e[q].push_back(p);//先存对应的敌人是谁 for(int j=0;j<e[p].size();j++)//有敌人就也是我的朋友我需要合并 { join(q,e[p][j]); } for(int j=0;j<e[q].size();j++) { join(p,e[q][j]); } } else { join(p,q); } } int ans=0; for(int i=1;i<=n;i++) { if(find(i)==i) ans++; } cout<<ans; return 0; }
- 1
信息
- ID
- 921
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 34
- 已通过
- 21
- 上传者