Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 16509 | Accepted: 7920 |
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
Source
Asia Kaohsiung 2003
这道题目的数据好像是有些弱,数据中不包含 以下这种情况
100 3
4 1 2 3 4
2 1 6
1 0
这道题目应该是输出1的,但是我的代码输出了5竟然对了,尽管对了,我还是改了改代码,这题的主要思路我是用并查集做的
本该WA的代码:
#include
#include
using namespace std;
int a[31000];
struct num
{
int end,next;
}b[100000];
int c[510];
bool status[31000];
int main()
{
void build(int x,int y);
int find (int x);
int i,j,n,m,s,t,key,k;
int x,y,sum;
while(cin>>n>>m)
{
if(!n&&!m)
{
break;
}
for(i=1;i<=n+m;i++)
{
a[i]=i;
}
memset(c,-1,sizeof(c));
memset(status,true,sizeof(status));
key=0;
for(i=1,y=0;i<=m;i++)
{
cin>>s;
for(j=1;j<=s;j++)
{
cin>>x;
if(x==0)
{
key=1;
}
b[y].end=x+1; b[y].next=c[i];
c[i]=y; y++;
build(x+1+m,i);
}
}
if(!key)
{
cout<<1<
正确的代码、
#include
#include
using namespace std;
int a[31000];
int b[31000];
bool status[31000];
int main()
{
void build(int x,int y);
int find (int x);
int i,j,n,m,s,t,key,k,tag;
int x,y,sum;
while(cin>>n>>m)
{
if(!n&&!m)
{
break;
}
for(i=1;i<=n+m;i++)
{
a[i]=i;
}
memset(status,true,sizeof(status));
tag=0;
for(i=1;i<=m;i++)
{
cin>>s;
for(j=1;j<=s;j++)
{
cin>>x;
if(status[x+1]==true)
{
b[tag++]=x+1+m;
status[x+1]=false;
}
build(x+1+m,i);
}
}
k=find(1+m);
sum=1;
for(i=0;i<=tag-1;i++)
{
key=find(b[i]);
if(b[i]==1+m)
{
continue;
}
if(key==k)
{
sum++;
}
}
cout<