树的染色(给树染色)
不太清楚其正确性,主要是我并没有完全理解。贪心的题总是奇奇怪怪。
我自己的代码:
#include<cstdio>
#include<cstring>
//#define zczc
using namespace std;
const int N=1010;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
wh*=f;return;
}
struct node{
int f,size,sum,ans;
double avg;
}a[N];
int m,root;
inline int find(){
double ss=0;int an;
for(int i=1;i<=m;i++){
if(i==root)continue;
if(a[i].avg>ss)ss=a[i].avg,an=i;
}
return an;
}
struct edge{
int t,next;
}e[N<<1];
int esum,head[N];
inline void add(int fr,int to){
e[++esum]=(edge){to,head[fr]};head[fr]=esum;
}
void dfs(int wh,int fa){
a[wh].f=fa;
for(int i=head[wh],th;i;i=e[i].next){
if((th=e[i].t)==fa)continue;dfs(th,wh);
}
}
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
read(m);read(root);
while(m&&root){
memset(head,0,sizeof(head));esum=0;
for(int i=1;i<=m;i++){
a[i].size=1;read(a[i].sum);a[i].avg=a[i].ans=a[i].sum;
}
for(int i=1;i<m;i++){
int s1,s2;read(s1);read(s2);add(s1,s2);add(s2,s1);
}
dfs(root,0);
for(int i=1;i<m;i++){
int wh=find();int fa=a[wh].f;
for(int j=1;j<=m;j++){
if(a[j].f==wh)a[j].f=fa;
}
//printf("find:%d\n",wh);
a[fa].ans+=a[fa].size*a[wh].sum;
a[fa].size+=a[wh].size;
a[fa].sum+=a[wh].sum;
a[fa].avg=(double)a[fa].sum/a[fa].size;
a[wh].avg=-1;
//for(int i=1;i<=m;i++)printf("%d %d\n",a[i].size,a[i].ans);
//printf("\n");
}
int ans=0;
for(int i=1;i<=m;i++)ans+=a[i].ans;printf("%d\n",ans);
read(m);read(root);
}
return 0;
}
一如既往,万事胜意