题目:点击打开链接
题目讲一个老师邀请尽量多的同学去家,这些同学应该都是朋友关系,问最多能有几个同学去。
这个题需要对序号进行优化,把树按顺序排起来,然后再进行比较,顺便不要忘了0的情况,有一个同学会去的。
这个题最初看的时间上 c++要求1000MS JAVA要求4000MS,也没推导出应该优化序号,用JAVA过了样例,但是提交上去是WA,时间也还充裕。。如果有大犇能帮忙改对了,小弟在此表示感谢了。。。最后附上WA代码。。
C++ AC代码:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int father[10000009];
int dep[10000009];
int maxboy=1;
int search_father(int tar)
{
int result=tar;
while(result!=father[result])
result=father[result];
return result;
}
void merge(int a,int b)
{
int fx=search_father(a);
int fy=search_father(b);
if(fx!=fy)
{
if(dep[fx]>dep[fy])
{
int temp=fy;
fy=fx;
fx=temp;
}
father[fx]=fy;
dep[fy]=dep[fx]+dep[fy];
if(maxboy<dep[fy])
{
maxboy=dep[fy]; //居然没有发现
}
}
}
int main()
{
int testcase=0;
int a,b;
while(cin>>testcase)
{
maxboy=1;
for(int i=0;i<10000009;i++) //全部都要初始化
{
father[i]=i;
dep[i]=1;
}
for(int j=1;j<=testcase;j++)
{
cin>>a>>b;
merge(a,b);
}
printf("%d\n",maxboy);
}
return 0;
}
JAVA WA代码:
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
static int father[]=new int [10000009];
static int dep[]=new int [10000009];
static int maxboy=1;
static int search_father(int tar)
{
int result=tar;
while(result!=father[result])
result=father[result];
return result;
}
static void merge(int a,int b)
{
int fx=search_father(a);
int fy=search_father(b);
if(fx!=fy)
{
father[fx]=fy;
dep[fy]=dep[fx]+dep[fy];
if(maxboy<dep[fy])
{
maxboy=dep[fy]; //居然没有发现
}
}
}
public static void main(String args[])
{
int testcase=0;
int a,b;
Scanner cin=new Scanner(new InputStreamReader(System.in));
while(cin.hasNextInt())
{
testcase=cin.nextInt();
maxboy=1;
for(int i=0;i<10000009;i++) //全部都要初始化
{
father[i]=i;
dep[i]=1;
}
for(int j=1;j<=testcase;j++)
{
a=cin.nextInt();
b=cin.nextInt();
merge(a,b);
}
System.out.println(maxboy);
}
}
}