HDU3560一直TLE
冒个泡。。。这里几个月没更新了吧?= = http://acm.hdu.edu.cn/showproblem.php?pid=3560 是这个题。。一直TLE 看起来是个简单的并查集题目。。周日刚学的 昨晚开始写,参照是学长的union函数,今天看了CRLS上这一部分,改了改。 网上搜了几个程序,看起来和我的都差不多嘛,删删改改交了十几次都是TLE= = 似乎。。很少遇到这种情况啊。
这是TLE代码,求助= =
#include
#include
#define maxn 100005
int father[maxn],rank[maxn]; //father初始化为-1,<del>其实还不太理解rank为什么只在相等的时候加1</del>。懂了!“Maintain rank(x) as an upper bound on the depth of the tree rooted at x. ” 可以google一下 union by rank. 有个PPT
int findfather(int a)
{
if (father[a]<0) return a;
else
{
father[a]=findfather(father[a]);
return father[a];
}
}
void un (int u, int v)
{
int rx=findfather(u),ry=findfather(v);
if (rx!=ry)
{
if (rank[rx]>rank[ry]) father[ry]=rx;
else
{
father[rx]=ry;
if (rank[rx]==rank[ry]) rank[ry]++;
}
}
}
int main()
{
int m,n,u,v,ans1,ans2;
int i;
int degree[maxn],flag[maxn];
while(scanf("%d%d",&n;,&m;)!=EOF)
{
memset(father,-1,sizeof(father));
memset(degree,0,sizeof(degree));
memset(flag,0,sizeof(flag));
memset(rank,0,sizeof(rank));
ans1=0;
ans2=0;
if (n==0 && m==0) break;
for (i=0;i<m;i++)
{
scanf("%d%d",&u;,&v;);
un(u,v);
degree[u]++;
degree[v]++;
}
for (i=0;i<n;i++)
{
if (degree[i]!=2) flag[findfather(i)]=1; //度不为二,则不是环
}
for (i=0;i<n;i++)
{
if (father[i]<0) //如果是树根
{
ans1++;
if (!flag[i]) ans2++;
}
}
printf("%d %d\n",ans1,ans2);
}
return 0;
}
comments powered by Disqus