1、WA代码

思路:预先分好3类,对每一行数据进行分类和真话假话判断

WA原因:前面某些行的数据 需要依赖 后面某些行给的数据 才能进行分类

初步改正思路( 对于前面给的无法直接分类的数据进行记录,等遇到合适的数据再拿出来进行分类  数据给完还无法分类的列为假话 )

未改正代码

# include<iostream>
# include<string>
# include<string.h>
# include<queue>
# include<stdio.h>
# include<math.h>
#include <algorithm>
using namespace std;
#define MAX 50005
//int rank[MAX];
int pre[MAX];
int tot,n;
int flag[];
struct Node
{
int a,b,c;
}node;
queue<Node> q;
void Init()
{
for(int i=;i<=n+;i++) //pre[n+1]表示A类动物 pre[n+2]表示B类动物 pre[n+3]表示C类动物
{
pre[i] = i;
//rank[i] = 1;
}
tot = ;
flag[] = ; //表示尚无A类动物
flag[] = ;
flag[] = ;
}
int find(int x)
{
int p=x,t;
while(pre[p]!=p) //x结点迭代往上寻找到祖宗结点 存储在p
{
p = pre[p];
} while(x != p) // 把x结点到其祖宗结点中 经过的所有结点 都直接连到 祖宗结点
{
t = pre[x];
pre[x] = p;
x = t;
}
return x;
}
void Unite(int x,int y)
{
x = find(x);
y = find(y);
if(x==y)
return;
pre[x] = y;
/*
if(rank[x]<rank[y]) //高度小的为子树
{
pre[x] = y;
}
else
{
pre[y] = x;
if(rank[x] == rank[y])
rank[x]++;
}
*/
}
void judge()
{
int ct=;
while(!q.empty())
{ node = q.front();
int a,b,c;
a = node.a;
b = node.b;
c = node.c;
int fb,fc,f=;
fb = find(b);
fc = find(c); //printf("%d %d %d %d %d %d\n",f,fb,fc,flag[0],flag[1],flag[2]);
//printf("%d\n--------------------------------------\n",tot);
if(ct>=) break; if(b>n || c>n ||b<= || c<=) //假话条件2判断
{
tot++;
q.pop();
continue;
}
if(a== && b==c) //假话条件3 =判断
{
tot++;
q.pop();
continue;
}
if(a==)
{
if( fb==b && fc==c ) //b,c编号动物都是第一次出现
{
for(int i=;i<;i++) //3个类别未满
{
if(flag[i]==)
{
//Unite(b,n+i+1);
//Unite(c,n+i+1);
pre[b] = n+i+;
pre[c] = n+i+;
flag[i] = ;
f = ;
q.pop();
break;
}
}
if(f==) continue;
//类别已满
q.push(node);
ct++;
}
else if(fb==b && fc!=c) //b编号动物第一次出现,c编号动物已有分类
{
pre[b] = fc;
flag[fc-n-] = ;
q.pop();
continue;
}
else if(fb!=b && fc==c) //c编号动物第一次出现,b编号动物已有分类
{
pre[c] = fb;
flag[fb-n-] = ;
q.pop();
continue;
}
else //b,c编号动物都已分类
{
if(fb!=fc) //出现矛盾
{
tot++;
q.pop();
continue;
}
} }
else
{
//printf("%d %d",b,c);
if( fb==b && fc==c ) //b,c编号动物都是第一次出现
{
//printf("sddsgfdg");
for(int i=;i<;i++) //3个类别未满
{
int j = (i+)%;
if(flag[i]== && flag[j]==)
{
//Unite(b,n+i+1);
//Unite(c,n+j+1);
pre[b] = n+i+;
pre[c] = n+j+;
flag[i] = ;
flag[j] = ;
f = ;
q.pop();
break;
}
} if(f==) continue;
//类别已满
q.push(node);
ct++;
}
else if(fb==b && fc!=c) //b编号动物第一次出现,c编号动物已有分类
{
if(fc==n+)
{
pre[b] = n+; //Unite(b,n+3);
flag[] = ;
q.pop();
continue;
}
else if(fc==n+)
{
pre[b] = n+; //Unite(b,n+1);
flag[] = ;
q.pop();
continue;
}
else if(fc==n+)
{
pre[b] = n+; //Unite(b,n+2);
flag[] = ;
q.pop();
continue;
}
}
else if(fb!=b && fc==c) //c编号动物第一次出现,b编号动物已有分类
{
if(fb==n+)
{
pre[c] = n+; //Unite(c,n+2);
flag[] = ;
q.pop();
continue;
}
else if(fb==n+)
{
pre[c] = n+; //Unite(c,n+3);
flag[] = ;
q.pop();
continue;
}
else if(fb==n+)
{
pre[c] = n+; //Unite(c,n+1);
flag[] = ;
q.pop();
continue;
}
}
else //b,c编号动物都已分类
{
if(fb-fc==- )
{
q.pop();
continue;
}
else if(fb-fc== )
{
q.pop();
continue;
}
tot++;
q.pop();
continue;
}
}
}
while(!q.empty())
{
tot++;
q.pop();
}
} int main()
{
int k;
scanf("%d %d",&n,&k);
Init();
int i,j;
for(i=;i<k;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
node.a = a;
node.b = b;
node.c = c;
q.push(node);
//printf("%d\n---------------------------\n",tot);
}
judge();
printf("%d",tot);
return ;
}

2、

正确思路:不按照捕食关系进行细致分类,而是按照动物间存在关系就分为一类,用relation表示结点与父节点的关系

NYOJ 食物链(WA)的更多相关文章

  1. poj 1182 食物链 &amp;&amp; nyoj 207(种类并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 52414   Accepted: 15346 Description ...

  2. POJ 1182 食物链(带权并查集)

    传送门 食物链  Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65579   Accepted: 19336 Descri ...

  3. bzoj4562: [Haoi2016]食物链--记忆化搜索

    这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞 题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路 从入读为零的点进行记忆化搜索,搜到出度为零的点返回1 所有 ...

  4. 食物链 poj 1182

    C - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  5. POJ 1182 食物链(种类并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63592   Accepted: 18670 Description ...

  6. NYOJ 45 棋盘覆盖 模拟+高精度

    题意就不说了,中文题... 小白上讲了棋盘覆盖,于是我就挖了这题来做. 棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下. 公式就是f(k) = f(k - 1) * 4 + 1,再化解下 ...

  7. POJ 1182 食物链 -- 解题报告

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 70529   Accepted: 20875 Description ...

  8. PAT-L3-球队“食物链”-dfs-状压-set

    题目分析: 1. 一场双循环赛制的篮球赛,注意双循环,双循环! 2. 共有n只球队,两两之间有胜有负有平局: 3. 输入: 举例: 第一行:W:代表球队1打赢过这只队伍 L:代表球队2没打赢过这只队伍 ...

  9. 食物链-HZUN寒假集训

    食物链 总时间限制: 1000ms 内存限制: 65536kB 描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动 ...

随机推荐

  1. 【CF566C】Logistical Questions 点分

    [CF566C]Logistical Questions 题意:给你一棵n个点的树,点有点权,边有边权,两点间的距离为两点间的边权和的$3\over 2$次方.求这棵树的带权重心. $n\le 200 ...

  2. Linux----知识储备

    ----------------------------------------------------------------------基础---------------------------- ...

  3. 快速排序中的partition.

    经典快速排序中的partition, 将最后一个元素作为划分点. 维护两个区域. <= x 的, >x 的区域. 划分过程中还有个待定的区域. [L,less] 区域小于x, [less+ ...

  4. tensorflow如何正确加载预训练词向量

    使用预训练词向量和随机初始化词向量的差异还是挺大的,现在说一说我使用预训练词向量的流程. 一.构建本语料的词汇表,作为我的基础词汇 二.遍历该词汇表,从预训练词向量中提取出该词对应的词向量 三.初始化 ...

  5. CountDownLatch简单使用

    CountDownLatch介绍 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过 ...

  6. 10.11JAVA作业

    [实验任务一]:素数输出 1. 实验要求: (1)编写判断该数是否为素数的方法,并在主方法中对其进行调用. (2)注意编程规范:程序开头部分的目的,作者以及日期:必要的空格与缩进,适当的注释等: (3 ...

  7. block diagonal matrix 直和 块对角矩阵 不完美 有缺陷 缩放 射影几何

    小结: 1.block diagonal matrix  直和 块对角矩阵 A block diagonal matrix is a block matrix that is a square mat ...

  8. 可执行代码(Executable Code)目标代码(object code)

    小结: 1.可执行代码(Executable Code)是指将目标代码(object code)连接后形成的代码,简单来说是机器能够直接执行的代码. https://baike.baidu.com/i ...

  9. 2016年蓝桥杯省赛A组c++第4题(算法填空)

    /* 排序在各种场合经常被用到. 快速排序是十分常用的高效率的算法. 其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它. 这样,排序问题 ...

  10. Chap3:区块链的衍生技术[《区块链中文词典》维京&甲子]