| ||||||||||
| 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 | |||||||||
请帮看看哪里出问题了我先找到Ci最大的点 如果Ci同为最大 就比较父节点的Ci值 大的就让它与它的所有父结点入队列order(已经入队列的就不需要再入了)
要是一直找到根节点他们的Ci值都相同 就将层数较小的那棵字树先入队列order
这个思想是不是本身就有问题 还是程序写错了..
#include<iostream>
using namespace std;
int N,R;
struct tree
{
int number;
int Ci;
int Father;
}node1[1001],node2[1001];
int findfather(int father2,int father1)
{
if( father2==R && father1!=R )
{
return 1;
}
else if( father2!=R && father1==R)
{
return -1;
}
else if( father2==father1)
{
return 0;
}
else if( node2[father2].Ci != node2[father1].Ci )
{
return node2[father2].Ci - node2[father1].Ci;
}
else
{
return findfather(node2[father2].Father,node2[father1].Father);
}
}
int compare(const void *elem1,const void *elem2)
{
tree *p1,*p2;
p1=(tree*)elem1;
p2=(tree*)elem2;
if( p2->Ci != p1->Ci )
{
return p2->Ci - p1->Ci;
}
else
{
return findfather(p2->Father,p1->Father);
}
}
int main()
{
int cost;
int queue[1001],tops;
int i,j;
int father,son;
int isorder[1001];
int number,order[1001],orders;
while(cin>>N>>R && N!=0 && R!=0)
{
cost=0;
isorder[R]=1;
memset(isorder,0,sizeof(isorder));
memset(order,0,sizeof(order));
order[0]=R;
for(i=1;i<=N;i++)
{
node1[i].number=i;
node2[i].number=i;
cin>>node1[i].Ci;
node2[i].Ci=node1[i].Ci;
node1[i].Father=0;
node2[i].Father=0;
}
for(i=1;i<N;i++)
{
cin>>father>>son;
node1[son].Father=father;
node2[son].Father=father;
}
for(i=1;i<=N;i++)
{
int tempnumber,tempCi,tempFather;
if(node1[i].number==R)
{
tempnumber=node1[1].number;
tempCi=node1[1].Ci;
tempFather=node1[1].Father;
node1[1].number=node1[i].number;
node1[1].Ci=node1[i].Ci;
node1[1].Father=node1[i].Father;
node1[i].number=tempnumber;
node1[i].Ci=tempCi;
node1[i].Father=tempFather;
break;
}
}
qsort(node1+2,N-1,sizeof(tree),compare);
orders=1;
tops=0;
for(i=2;i<=N;i++)
{
number=node1[i].number;
if(isorder[number]==0)
{
while(node2[number].Father!=R && isorder[number]==0)
{
queue[tops++]=number;
isorder[number]=1;
number=node2[number].Father;
}
j=0;
if(isorder[number]==0)
{
order[orders++]=number;
isorder[number]=1;
}
orders+=tops;
while(j<tops)
{
order[--orders]=queue[j];
j++;
}
orders+=tops;
tops=0;
}
}
for(i=0;i<N;i++)
{
number=order[i];
cost+=node2[number].Ci * (i+1);
}
cout<<cost<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator