1.阅读题,读明白题就能过。
2.贪心题,简单想一想就能过。
3.并查集,抽象出来图论模型就能过,抽象不出来,累死你。
按照《图论算法理论、实现及应用》书上的模板敲,RE在第48组,现在也不知道为什么。
于是敲常规的并查集:
#include <iostream> #include <stdio.h> using namespace std; struct P{ int x,y; }p[100000]; int parent[100000]; int n; int find(int x){ return x==parent[x] ? x : parent[x]=find(parent[x]); } int main(){ while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ cin >> p[i].x >> p[i].y; } for(int i=0;i<n;i++){ parent[i]=i; } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(p[i].x==p[j].x || p[i].y==p[j].y){ if(find(i)==find(j)) continue; else parent[find(i)]=find(j); } } } int cou=0; for(int i=0;i<n;i++){ if(parent[i]==i) cou++; } printf("%d\n",cou-1); } return 0; }
发现飞哥的神并查集+优化模板:
int find(int x){ return x==parent[x] ? x : parent[x]=find(parent[x]); }
for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(p[i].x==p[j].x || p[i].y==p[j].y){ if(find(i)==find(j)) continue; else parent[parent[i]]=j; } } }