记录编号 58102 评测结果 AAAAAAAAAA
题目名称 读书 最终得分 100
用户昵称 Gravatarfeng 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2013-04-17 14:46:32 内存使用 3.61 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
struct node{
	int nex;
}a[200];
struct edge{
	int nex,y,v;
}e[40000];
int p,n,m;
int t[200];
int dis[200];
bool f[200];
bool g[200];
int min(int a,int b){
	return a<b?a:b;
}
void add(int x,int y,int v){
	p++;
	e[p].nex=a[x].nex;
	a[x].nex=p;
	e[p].y=y;
	e[p].v=v;
}
void updata(int s){
	int t=a[s].nex;
	while (t){
		int y=e[t].y;
		if (!g[y]){
			dis[y]=e[t].v;
			g[y]=true;
			updata(y);
		}
		t=e[t].nex;
	}
}
int prim(){
	memset(f,false,sizeof(f));
	memset(g,false,sizeof(g));
	for (int i=1;i<=n;i++)
		dis[i]=t[i];
	/*
	t=a[k].nex;
	while (t){
		y=e[t].y;
		dis[y]=min(dis[y],e[t].v);
		t=e[t].nex;
	}*/
	int sum=0;
	int minn,k,y,tt;
	for (int i=1;i<=n;i++){
		minn=20000000;
		for (int j=1;j<=n;j++)
			if (!f[j] && dis[j]<minn){
				minn=dis[j];
				k=j;
			}
			f[k]=true;
			g[k]=true;
			sum+=dis[k];
			
			/*
			tt=a[k].nex;
			while (tt){
				y=e[tt].y;
				if (!f[y]){
					dis[y]=min(dis[y],e[tt].v);
				}
				tt=e[tt].nex;
			}*/
			updata(k);
	}
	
	//for (int i=1;i<=n;i++)
	//	sum+=dis[i];
	return sum;
}
void init(){
	freopen("reading.in","r",stdin);
	freopen("reading.out","w",stdout);
	scanf("%d%d",&n,&m);
	while (n!=0 || m!=0){
		memset(a,0,sizeof(a));
		memset(e,0,sizeof(e));
		for (int i=1;i<=n;i++){
			scanf("%d",&t[i]);
		}
		int x,y;
		for (int i=1;i<=m;i++){
			scanf("%d%d",&x,&y);
			x++;
			y++;
			add(x,y,t[y]>>1);
			add(y,x,t[x]>>1);
		}
		int ans=prim();
		printf("%d\n",ans);
		scanf("%d%d",&n,&m);
	}
}
int main()
{
	init();
	return 0;
}