1854: [Scoi2010]游戏
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5258 Solved: 2098
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
1 2
3 2
4 5
Sample Output
HINT
【数据范围】
对于30%的数据,保证N < =1000
对于100%的数据,保证N < =1000000
Source
把每一个装备考虑成一条边,它的两个属性考虑成边两端点的编号。使用装备相当于删除这条边。
于是可以发现如果某连通块图中有环,那么环上的点必定都可以取到。如果是树结构,让编号最大的取不到即可。
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long ll;
#define inf 10000000
#define maxn 10005
#define eps 1e-10
int flag[maxn],parent[maxn];
int find(int x)
{
if(parent[x]==x)
return x;
return parent[x]=find(parent[x]);
}
int main(void)
{
int n,i,j,x,y;
scanf("%d",&n);
for(i=1;i<=maxn;i++)
parent[i]=i;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
int t1=find(x),t2=find(y);
if(t1!=t2)
{
if(t1>t2)
swap(t1,t2);
parent[t1]=t2;
flag[t1]=1;
}
else
flag[t2]=1;
}
for(i=1;i<=maxn;i++)
if(flag[i]==0)
{
printf("%d\n",i-1);
break;
}
return 0;
}