| ||||||||||
| 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 | |||||||||
color a tree (why my mathod is wrong?)我的算法是每次找没有被入栈的ci最大的点,将他的没有入栈的父亲和父亲的父亲...依此入栈
然后从栈底开始求和,代码如下?这个贪心的方法不对?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct pi
{
int c,id,sd;
}p[1010],t[1010];
int f[1010],pt[1010];
bool v[1010];
int cmp (const void *a,const void *b)
{
int d= (((struct pi*)a)->c - ((struct pi *)b)->c);
if (d>0) return 1;
else if (d<0) return -1;
int e=((struct pi *)a)->sd - ((struct pi *)b)->sd;
if (e>0) return 1;
else if (e<0) return -1;
else return 0;
}
int main ()
{
int n,r,fa,sn,i,tmp,ts,cnt,cn,sum;
while (scanf ("%d%d",&n,&r) && (n || r))
{
memset (p,0,sizeof (p));
memset (v,0,sizeof (v));
memset (f,0,sizeof (f));
memset (pt,0,sizeof (pt));
for (i=1;i<=n;i++)
{
scanf ("%d",&p[i].c);
p[i].id=i;
}
for (i=1;i<n;i++)
{
scanf ("%d%d",&fa,&sn);
f[sn]=fa;
}
for (i=1;i<=n;i++)
{
cnt=0;
tmp=i;
while (tmp)
{
cnt++;
tmp=f[tmp];
}
p[i].sd=cnt;
}
memcpy (t,p,sizeof (p));
qsort (&p[1],n,sizeof (p[0]),cmp);
cn=0;
for (i=n;i>=1;i--)
{
tmp=p[i].id;
if (v[tmp]==0)
{
cnt=cn;
while (tmp>0)
{
if (v[tmp]==0)
{
cnt++;
tmp=f[tmp];
}
else break;
}
cn=cnt;
tmp=p[i].id;
while (tmp>0)
{
if (v[tmp]==0)
{
pt[cnt]=tmp;
cnt--;
v[tmp]=1;
tmp=f[tmp];
}
else break;
}
}
}
sum=0;
for (i=1;i<=n;i++)
sum+=i*t[pt[i]].c;
printf ("%d\n",sum);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator