树中的点永远是边数+1。然后判断图中最大联通分量是否大于一。并且们每个点都要访问到。不过目测这道题目深搜也可以过。
#include<iostream> #include<set> #include<cstdio> #include<vector> using namespace std; const int MAXN=10000005; const int MAXM=100005; int u[MAXN]; int sum[MAXN]; set<int>num; //bool seted[MAXN]; int find(int p) { if(u[p]==p) { // seted[p]=1; return p; }else { // seted[p]=1; return u[p]=find(u[p]); } } void connect(int a,int b) { int f1=find(a); int f2=find(b); if(f1<f2) { u[f2]=f1; }else { u[f1]=f2; } } int main() { int n; while(scanf("%d",&n)!=EOF) { int max=1; int i=0; num.clear(); vector<int>input[2]; input[0].clear(); input[1].clear(); //memset(seted,0,sizeof(seted)); for(i=0;i<=n-1;i++) { int num1,num2; scanf("%d%d",&num1,&num2); num.insert(num1); num.insert(num2); input[0].push_back(num1); input[1].push_back(num2); } set<int>::reverse_iterator cp=num.rbegin(); for(cp=num.rbegin();cp!=num.rend();cp++) { u[*cp]=*cp; sum[*cp]=0; } //memset(sum,0,sizeof(sum)); for(i=0;i<=n-1;i++) { connect(input[0][i],input[1][i]); } for(cp=num.rbegin();cp!=num.rend();cp++) { sum[find(*cp)]++; } for(cp=num.rbegin();cp!=num.rend();cp++) { if(sum[*cp]>max) { max=sum[*cp]; } } printf("%d\n",max); } return 0; }