第一次看的时候想到了并查集,但是不知道怎么实现;
标解,f[i]表示i所属的集合,用f[i+n]表示i所属集合的补集,实现的很巧妙,可以当成一个使用并查集的范例;
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<map> 6 #include<ctime> 7 #include<vector> 8 #include<set> 9 #include<cmath> 10 #include<algorithm> 11 using namespace std; 12 const int maxn=20200; 13 struct node{ 14 int x,y,v; 15 bool operator<(const node& b)const{return v>b.v;} 16 }e[120000]; 17 int f[maxn<<1],n,m; 18 void init(){ 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].v); 21 sort(e+1,e+m+1); 22 } 23 void print(int x){cout<<x<<endl;exit(0);} 24 int getfather(int x){return f[x]==x?x:f[x]=getfather(f[x]);} 25 void work(){ 26 for(int i=1;i<=(n<<1);i++)f[i]=i; 27 int x,y; 28 for(int i=1;i<=m;i++){ 29 x=getfather(e[i].x);y=getfather(e[i].y); 30 if(x==y)print(e[i].v); 31 else {f[x]=getfather(e[i].y+n),f[y]=getfather(e[i].x+n);} 32 } 33 print(0); 34 } 35 int main(){ 36 init(); 37 work(); 38 }
时间: 2024-09-30 16:39:18