| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
思考一下午+看题解...其实就是并查集,但是有点变化,就是把所有的食物链上的东西都放到同一个集合里去,但是彼此之间的吃与被吃的关系,通过一个“相对位置”,再次进行判断...
#include <iostream>
#include<string>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<vector>
using namespace std;
int dic1[1000010], dic2[1000010], dic3[1000010];
struct food
{
int pre, relation;
}f[50010];
int getparent(int k)
{
if(k == f[k].pre) return k;
int mid = f[k].pre;
f[k].pre = getparent(mid);
f[k].relation = (f[k].relation + f[mid].relation) % 3;
return f[k].pre;
}
int main()
{
freopen("D:\\CPPProgram\\ACM\\in.txt", "r", stdin);
int N, k;
scanf("%d %d", &N, &k);
for(int i=1; i<=N; i++)
{
f[i].pre = i;
f[i].relation = 0;
}
int ans = 0;
for(int i=1; i<=k; i++)
{
scanf("%d %d %d", &dic1[i], &dic2[i], &dic3[i]);
if(dic2[i]>N || dic3[i] > N)
{
ans++;
continue;
}
if(dic1[i] == 2 && dic2[i] == dic3[i])
{
ans++;
continue;
}
int r1, r2;
r1 = getparent(dic2[i]);
r2 = getparent(dic3[i]);
if(r1 != r2)
{
f[r2].pre = r1;
f[r2].relation = (3 + dic1[i]-1+f[dic2[i]].relation - f[dic3[i]].relation)%3;
}
else
{
if(dic1[i] == 1 && f[dic2[i]].relation != f[dic3[i]].relation)
{
ans++;
continue;
}
if(dic1[i] == 2 && (f[dic2[i]].relation - f[dic3[i]].relation + 30) % 3 != 2 )
{
ans++;
continue;
}
}
}
printf("%d\n", ans);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator