标签:
题目链接:传送门
题目思路:并查集高级应用(类似食物链那道题),主要是维护两个集合(监狱里犯人的关系),同一个集合里的是朋友,否则是敌人,如果敌人在同一间监狱里,
则最小的最大冲突值求出。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <cctype> #include <queue> #include <string> #include <vector> #include <set> #include <map> #include <climits> #define lson root<<1,l,mid #define rson root<<1|1,mid+1,r #define fi first #define se second #define seg int root,int l,int r #define ping(x,y) ((x-y)*(x-y)) #define mst(x,y) memset(x,y,sizeof(x)) #define mcp(x,y) memcpy(x,y,sizeof(y)) #define Min(x,y) (x<y?x:y) #define Max(x,y) (x>y?x:y) using namespace std; #define gamma 0.5772156649015328606065120 #define MOD 100000007 #define inf 0x3f3f3f3f #define N 100005 #define maxn 10001000 typedef long long LL; typedef pair<int,int> PII; struct Node{ int x,y; int v; bool operator<(const Node &a)const{ return v>a.v; } }node[N]; int fp[N<<1]; int findp(int x){return fp[x]==x?x:fp[x]=findp(fp[x]);} int main(){ int i,x,y,m,n; scanf("%d%d",&n,&m); for(i=0;i<m;++i){ scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].v); } for(i=0;i<=n<<1;++i) fp[i]=i; sort(node,node+m); ///贪心思想 int ans=0; for(i=0;i<m;++i){ x=node[i].x; y=node[i].y; int xx=findp(x); int yy=findp(y); if(xx==yy){ ans=node[i].v; break; } fp[xx]=findp(y+n); ///x与y的敌人肯定在同一个监狱 fp[yy]=findp(x+n); ///同理y与x的敌人肯定在一个监狱 } printf("%d\n",ans); return 0; }
标签:
原文地址:http://www.cnblogs.com/Kurokey/p/5451163.html