| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
哪为大牛帮忙看看啊,老是超时。代码如下(RMQ算法)//注意,输入顺序不一定从根节点开始
#include<stdio.h>
#include<string.h>
// P55 第四种算法RMQ
int tree[1001][1001];
char string[1001];
int pointfather[1001];
int num_of_child[1001];
int E[1001];
int R[1001];
int children[1001];
int childrennum[1001];
int shendu[1001];
void DFS(int);
int LCA(int ,int);
int e=1,r=1;
int main()
{
int num_of_vertices;
int num_of_pairs;
int i,k;
int father;
int z;
int w;
// char ch;
int root,t;
int a,b;
// int flag;
int ancestor;
int total=0;
int num;
int onlychild;
scanf("%d ",&num_of_vertices);
for(z=0;z<num_of_vertices;z++)
{
gets(string);
i=0;
father=int(string[i])-48;
i++;
k=0;
while(i<int(strlen(string)))
{
if(string[i-1]=='('&&string[i+1]==')')
{
num=int(string[i])-48;
num_of_child[father]=num;
}
else if(string[i]<='9'&&string[i]>='1')
{
onlychild=int(string[i])-48;
tree[father][k++]=onlychild;
pointfather[onlychild]=father;
}
i++;
}
}
for(w=1;w<=num_of_vertices;w++)
if(pointfather[w]!=0)
children[pointfather[w]]++;
for(w=1;w<=num_of_vertices;w++)
if(pointfather[w]!=0)
root=w;
while(pointfather[root]!=0)
root=pointfather[root];
DFS(root); //深搜
scanf("%d ",&num_of_pairs);
for(z=0;z<num_of_pairs;z++)
{
gets(string);
for(i=0;i<int(strlen(string));i++)
{
if(string[i]=='(')
{
a=int(string[i+1])-48;
b=int(string[i+3])-48;
total++;
ancestor=LCA(a,b);
childrennum[ancestor]=childrennum[ancestor]+1;
if(total>=num_of_pairs)
break;
}
}
if(total>=num_of_pairs)
break;
}
//调试语句j
/* for(int v=0;v<=5;v++)
{
printf("%d ",v);
for(int vv=0;vv<=5;vv++)
printf("%d ",tree[v][vv]);
printf("\n");
}*/
for(t=0;t<1001;t++)
{
if(childrennum[t]>0)
printf("%d:%d\n",t,childrennum[t]);
}
return 0;
}
void DFS(int root)
{
int z;
if(pointfather[root]!=0)
shendu[root]=shendu[pointfather[root]]+1;
else
shendu[root]=1;
E[e]=root;
if(R[root]==0)
R[root]=e;
e++;
if(tree[root][0]==0)
{
E[e]=root;
e++;
}
else
{
for(z=0;z<children[root];z++)
{
DFS(tree[root][z]);
tree[root][z]=0;
E[e]=root;
e++;
}
}
}
int LCA(int a,int b)
{
int min=100000000;
// int middle;
int flag;
int x;
int before,last;
if(R[a]<R[b])
{
before=R[a];
last=R[b];
}
else
{
before=R[b];
last=R[a];
}
for(int i=before;i<=last;i++)
{
x=E[i];
if(shendu[x]<min)
{
min=shendu[x];
flag=x;
}
}
return flag;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator