一下是本蒟蒻认为近几年来NOIP提高组比较难的题目,神犇觉得太水请手动关闭:-)
TOP10 NOIP 2010 关押罪犯
主要考点:并查集
开两倍并查集,f[i],f[j+n]表示i和j在不同的监狱。利
用a与b不在一个监狱,b与c不在一个监狱,则a与c必定
在一个监狱这一性质合并集合。
1 #include<set> 2 #include<map> 3 #include<queue> 4 #include<stack> 5 #include<ctime> 6 #include<cmath> 7 #include<string> 8 #include<vector> 9 #include<cstdio> 10 #include<cstdlib> 11 #include<cstring> 12 #include<iostream> 13 #include<algorithm> 14 using namespace std; 15 struct data{ 16 int a,b,w; 17 }e[100010]; 18 int k[40010]; 19 int cmp(const data &A,const data &B) 20 { 21 return A.w>B.w; 22 } 23 int find(int x) 24 { 25 if(k[x]==x) return x; 26 else {k[x]=find(k[x]);return k[x];} 27 } 28 int main() 29 { 30 int n,m; 31 scanf("%d%d",&n,&m); 32 for(int i=1;i<=m;i++) 33 scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w); 34 for(int i=1;i<=2*n;i++) 35 k[i]=i; 36 sort(e+1,e+m+1,cmp); 37 for(int i=1;i<=m;i++) 38 { 39 int p=find(e[i].a),q=find(e[i].b); 40 if(p==q) {printf("%d",e[i].w);return 0;} 41 k[p]=find(e[i].b+n),k[q]=find(e[i].a+n); 42 } 43 printf("0"); 44 return 0; 45 }