树的染色(给树染色)

link 或者 link-HDU

不太清楚其正确性,主要是我并没有完全理解。贪心的题总是奇奇怪怪。

看它吧

我自己的代码:

#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;
}
posted @ 2022-06-19 11:56  Feyn618  阅读(37)  评论(0编辑  收藏  举报