求大神指点,程序运行没错,提交到poj却一大堆错误。。。。。
#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructnode{structnode*par...
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{struct node *parent;//指向物种代表
struct node *eat;//吃
struct node *be_eat;//被吃
int num;
int deep;
}animal;
animal * find(animal & p);//定位物种代表
void animal_is_agnate(animal &a,animal &b);//设置为同物种
void animal_is_eat(animal &a,animal &b);//设置为吃与被吃关系
int main()
{int i,j,a,b,stat,n,k,;
while((scanf("%d %d",&n,&k)==2)&&n>=1&&n<=50000&&k>=1&&k<=100000)
{ int wrong=0;
animal *p=(animal *)malloc((n+1)*sizeof(animal));
for( i=1;i<=n;i++)//初始化
{p[i].parent=&p[i];
p[i].eat=NULL;
p[i].be_eat=NULL;
p[i].num=i;
p[i].deep=1;
}
for( j=1;j<=k;j++)
{if((scanf("%d %d %d",&stat,&a,&b)==3)&&(stat==1||stat==2))
{if(stat==1)
{if(a>n||b>n) //超出范围
wrong++;
else
{ animal *p1=find(p[a]);
a=p1->num;
animal *p2=find(p[b]);
b=p2->num;
if(a!=b&&p[a].eat!=&p[b]&&p[a].be_eat!=&p[b])
animal_is_agnate(p[a],p[b]);
else
if((p[a].eat!=&p[b]||p[a].be_eat!=&p[b])&&a!=b)
wrong++;
}}
if(stat==2)
{
if(a>n||b>n)
wrong++;
else
{
animal *p3=find(p[a]);
a=p3->num;
animal *p4=find(p[b]);
b=p4->num;
if(a==b)
wrong++;
else if(p[a].eat==NULL)
animal_is_eat(p[a],p[b]);
else if(p[a].eat!=&p[b])
wrong++;
}//if
}//if
}//if
}//for
printf("%d\n",wrong);
}//while
return 0;
}
animal * find(animal & p)//定位物种代表
{
animal *temp;
if(p.parent!=&p)
{
temp=&p;
while(temp->parent!=temp)
temp=temp->parent;
p.parent=temp;
return p.parent;
}
else
return p.parent;
}
void animal_is_agnate(animal &a,animal &b)//设置为同物种
{
if(a.deep>=b.deep)
b.parent=&a;
else
a.parent=&b;
}
void animal_is_eat(animal &a,animal &b)//设置为吃与被吃关系
{
animal *temp1,*temp2;
temp1=find(a);
temp2=find(b);
temp1->eat=temp2;
temp2->be_eat=temp1;
if(temp2->eat!=NULL&&temp2->eat->eat!=temp1)
{
temp1->be_eat=temp2->eat;
temp2->eat->eat=temp1;
}
if(temp1->be_eat!=NULL&&temp1->be_eat->be_eat!=temp2)
{
temp2->eat=temp1->be_eat;
temp1->be_eat->be_eat=temp2;
}}
问题是http://poj.org/problem?id=1182
北大acm 题号1182,不要别的代码,只要告诉我错哪了,怎么改。。。。。谢谢了!!!! 展开
#include<stdlib.h>
#include<string.h>
typedef struct node
{struct node *parent;//指向物种代表
struct node *eat;//吃
struct node *be_eat;//被吃
int num;
int deep;
}animal;
animal * find(animal & p);//定位物种代表
void animal_is_agnate(animal &a,animal &b);//设置为同物种
void animal_is_eat(animal &a,animal &b);//设置为吃与被吃关系
int main()
{int i,j,a,b,stat,n,k,;
while((scanf("%d %d",&n,&k)==2)&&n>=1&&n<=50000&&k>=1&&k<=100000)
{ int wrong=0;
animal *p=(animal *)malloc((n+1)*sizeof(animal));
for( i=1;i<=n;i++)//初始化
{p[i].parent=&p[i];
p[i].eat=NULL;
p[i].be_eat=NULL;
p[i].num=i;
p[i].deep=1;
}
for( j=1;j<=k;j++)
{if((scanf("%d %d %d",&stat,&a,&b)==3)&&(stat==1||stat==2))
{if(stat==1)
{if(a>n||b>n) //超出范围
wrong++;
else
{ animal *p1=find(p[a]);
a=p1->num;
animal *p2=find(p[b]);
b=p2->num;
if(a!=b&&p[a].eat!=&p[b]&&p[a].be_eat!=&p[b])
animal_is_agnate(p[a],p[b]);
else
if((p[a].eat!=&p[b]||p[a].be_eat!=&p[b])&&a!=b)
wrong++;
}}
if(stat==2)
{
if(a>n||b>n)
wrong++;
else
{
animal *p3=find(p[a]);
a=p3->num;
animal *p4=find(p[b]);
b=p4->num;
if(a==b)
wrong++;
else if(p[a].eat==NULL)
animal_is_eat(p[a],p[b]);
else if(p[a].eat!=&p[b])
wrong++;
}//if
}//if
}//if
}//for
printf("%d\n",wrong);
}//while
return 0;
}
animal * find(animal & p)//定位物种代表
{
animal *temp;
if(p.parent!=&p)
{
temp=&p;
while(temp->parent!=temp)
temp=temp->parent;
p.parent=temp;
return p.parent;
}
else
return p.parent;
}
void animal_is_agnate(animal &a,animal &b)//设置为同物种
{
if(a.deep>=b.deep)
b.parent=&a;
else
a.parent=&b;
}
void animal_is_eat(animal &a,animal &b)//设置为吃与被吃关系
{
animal *temp1,*temp2;
temp1=find(a);
temp2=find(b);
temp1->eat=temp2;
temp2->be_eat=temp1;
if(temp2->eat!=NULL&&temp2->eat->eat!=temp1)
{
temp1->be_eat=temp2->eat;
temp2->eat->eat=temp1;
}
if(temp1->be_eat!=NULL&&temp1->be_eat->be_eat!=temp2)
{
temp2->eat=temp1->be_eat;
temp1->be_eat->be_eat=temp2;
}}
问题是http://poj.org/problem?id=1182
北大acm 题号1182,不要别的代码,只要告诉我错哪了,怎么改。。。。。谢谢了!!!! 展开
1个回答
展开全部
程序在C++下是没错的。但是你上传后的格式是.c,而C语言是不支持引用的,所以错误了。
上传之后的格式是不是可以改成.cpp,如果不能改,就修改函数形参吧,不要用引用形参了,用指针吧,下面是C语言的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
struct node *parent;//指向物种代表
struct node *eat;//吃
struct node *be_eat;//被吃
int num;
int deep;
}animal;
animal* find(animal* p);//定位物种代表
void animal_is_agnate(animal *a,animal *b);//设置为同物种
void animal_is_eat(animal *a,animal *b);//设置为吃与被吃关系
int main()
{
int i,j,a,b,stat,n,k;
while((scanf("%d %d",&n,&k)==2)&&n>=1&&n<=50000&&k>=1&&k<=100000)
{
int wrong=0;
animal *p=(animal *)malloc((n+1)*sizeof(animal));
for( i=1;i<=n;i++)//初始化
{
p[i].parent=&p[i];
p[i].eat=NULL;
p[i].be_eat=NULL;
p[i].num=i;
p[i].deep=1;
}
for( j=1;j<=k;j++)
{
if((scanf("%d %d %d",&stat,&a,&b)==3)&&(stat==1||stat==2))
{
animal *p1,*p2,*p3,*p4;
if(stat==1)
{
if(a>n||b>n) //超出范围
wrong++;
else
{
p1=find(&p[a]);
a=p1->num;
p2=find(&p[b]);
b=p2->num;
if(a!=b&&p[a].eat!=&p[b]&&p[a].be_eat!=&p[b])
animal_is_agnate(&p[a],&p[b]);
else
if((p[a].eat!=&p[b]||p[a].be_eat!=&p[b])&&a!=b)
wrong++;
}
}
if(stat==2)
{
if(a>n||b>n)
wrong++;
else
{
p3=find(&p[a]);
a=p3->num;
p4=find(&p[b]);
b=p4->num;
if(a==b)
wrong++;
else if(p[a].eat==NULL)
animal_is_eat(&p[a],&p[b]);
else if(p[a].eat!=&p[b])
wrong++;
}//if
}//if
}//if
}//for
printf("%d\n",wrong);
}//while
return 0;
}
animal * find(animal *p)//定位物种代表
{
animal *temp;
if(p->parent!=p)
{
temp=p;
while(temp->parent!=temp)
temp=temp->parent;
p->parent=temp;
return p->parent;
}
else
return p->parent;
}
void animal_is_agnate(animal *a,animal *b)//设置为同物种
{
if(a->deep>=b->deep)
b->parent=a;
else
a->parent=b;
}
void animal_is_eat(animal *a,animal *b)//设置为吃与被吃关系
{
animal *temp1,*temp2;
temp1=find(a);
temp2=find(b);
temp1->eat=temp2;
temp2->be_eat=temp1;
if(temp2->eat!=NULL&&temp2->eat->eat!=temp1)
{
temp1->be_eat=temp2->eat;
temp2->eat->eat=temp1;
}
if(temp1->be_eat!=NULL&&temp1->be_eat->be_eat!=temp2)
{
temp2->eat=temp1->be_eat;
temp1->be_eat->be_eat=temp2;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询