记录编号 |
58102 |
评测结果 |
AAAAAAAAAA |
题目名称 |
读书 |
最终得分 |
100 |
用户昵称 |
feng |
是否通过 |
通过 |
代码语言 |
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;
}