AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1601
【题解】
今天去bzoj上刷水题,于是就碰到了这道题。。。直接上kruskal
/*************
bzoj 1601
by chty
2016.12.16
*************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define FILE "read"
#define MAXN 90010*2
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
namespace INIT{
char buf[1<<15],*fs,*ft;
inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
inline int read(){
int x=0,f=1; char ch=getc();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();}
return x*f;
}
}using namespace INIT;
struct node{int x,y,v;}e[MAXN];
int n,len,ans,f[MAXN];
void insert(int x,int y,int v) {e[++len].x=x; e[len].y=y; e[len].v=v;}
int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}
bool cmp(node a,node b) {return a.v<b.v;}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read();
up(i,1,n) {int v=read(); insert(0,i,v);}
up(i,0,n) f[i]=i;
up(i,1,n) up(j,1,n){int v=read(); if(i!=j) insert(i,j,v);}
sort(e+1,e+len+1,cmp);
up(i,1,len){
int x=find(e[i].x),y=find(e[i].y);
if(x!=y){
ans+=e[i].v;
f[x]=y;
}
}
printf("%d\n",ans);
return 0;
}