我叫张小黑
张小黑的挣扎生活
posts - 66,  comments - 109,  trackbacks - 0
在我还有一口气的时候他终于过了........
 1#include<iostream>
 2#define MaxN 50000
 3typedef struct {
 4    int parent;
 5    int rank;
 6    int food;//指向食物类
 7    int enemy;//指向天敌类
 8}NODE;
 9NODE animal[MaxN+1];
10void init(int n)
11{
12    int i;
13    for(i=1;i<=n;i++){
14        animal[i].parent=i;
15        animal[i].rank=0;
16        animal[i].food=-1;
17        animal[i].enemy=-1;
18    }
19}
20int find_set(int x)
21{
22    if(x==-1)return -1;//有些food,enemy指向-1
23    if(animal[x].parent!=x)
24        animal[x].parent=find_set(animal[x].parent);
25    return animal[x].parent;
26}
27int union_set(int x,int y)
28{
29    if(x==-1)return y;
30    if(y==-1)return x;
31    if(animal[x].rank>animal[y].rank){
32        animal[y].parent=x;
33        return x;}
34    else {
35        animal[x].parent=y;
36        if(animal[x].rank==animal[y].rank)animal[y].rank++;
37        return y;}
38}
39void make(int x,int y,int fx,int fy,int ex,int ey)//创建x吃y的关系
40{
41    int t,v,w;
42    t=union_set(fx,y);//首先将y与x的food合并
43    v=union_set(x,ey);
44    w=union_set(ex,fy);
45    animal[v].enemy=w;
46    animal[v].food=t;
47    animal[t].enemy=v;
48    animal[t].food=w;
49    if(w!=-1){
50        animal[w].food=v;
51        animal[w].enemy=t;}
52}
53int main()
54{
55    int N,K,i,wn=0,x,y,fx,fy,ex,ey,oper;
56    int t,u,v;
57    scanf("%d%d",&N,&K);
58    init(N);
59    for(i=1;i<=K;i++){
60        scanf("%d%d%d",&oper,&x,&y);//oper为1的时候表示x和y是同类,oper为2的时候表示x吃y
61        if(x>N||y>N){wn++;continue;}
62        x=find_set(x);
63        y=find_set(y);
64        fx=find_set(animal[x].food);//fx可能是-1
65        fy=find_set(animal[y].food);//fy也可能是-1
66        ex=find_set(animal[x].enemy);
67        ey=find_set(animal[y].enemy);
68        if(x==y){if(oper==2)wn++;continue;}//1.x,y同类
69        if(fy==x){wn++;continue;}//3.y吃x
70        if(fx==y){if(oper==1)wn++;continue;}//2.x吃y
71        if(oper==2)make(x,y,fx,fy,ex,ey);//4..x和y尚未产生联系,创建联系,首先是x吃y,其次y的food类吃x
72        if(oper==1){//4..x和y尚未产生联系,创建联系
73            t=union_set(x,y);
74            u=union_set(fx,fy);
75            v=union_set(ex,ey);
76            animal[t].food=u;
77            animal[t].enemy=v;
78            if(u!=-1){
79                animal[u].enemy=t;
80                animal[u].food=v;}
81            if(v!=-1){
82            animal[v].food=t;
83            animal[v].enemy=u;}}
84    }
85    printf("%d\n",wn);
86    return 0;
87}
if(u!=-1)if(v!=-1)这里折腾了我两天
posted on 2008-01-31 20:39 zoyi 阅读(1504) 评论(5)  编辑 收藏 引用 所属分类: 数据结构

FeedBack:
# re: pku 1182 食物链
2009-03-30 21:36 | zoyi
有四百多人看了~~居然没有一个人留言~~世态炎凉丫~~  回复  更多评论
  
# re: pku 1182 食物链
2009-04-15 20:42 | 任逍遥
大哥,能把注解再弄的详细点吗?
小弟不才,看不懂呀。  回复  更多评论
  
# re: pku 1182 食物链
2009-04-16 18:46 | zoyi
哈哈~~好久以前写嗒~~凑活一下吧~哈哈~~@任逍遥
  回复  更多评论
  
# re: pku 1182 食物链
2009-08-14 00:07 | 汪淼
溜达溜达  回复  更多评论
  
# re: pku 1182 食物链
2011-09-01 16:32 | kid2012
大哥 这样也太复杂了点吧 能把思路讲清楚不
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


欢迎光临 我的白菜菜园

<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(8)

随笔分类

随笔档案

文章档案

相册

acmer

online judge

队友

技术

朋友

搜索

  •  

最新评论

阅读排行榜

评论排行榜