记录编号 249388 评测结果 AAAAAAAAAA
题目名称 通信线路 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 2.338 s
提交时间 2016-04-12 17:39:54 内存使用 77.77 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
const int MAXV=1501+1,MAXE=MAXV*MAXV*2+5;
struct EDGE{
	int u,v,w;
	bool operator<(const EDGE& rhs)const {return this->w<rhs.w;};
}st[MAXE];
struct SET{
	static const int SZ=MAXE;
	int p[SZ];
	SET(){memset(this,0,sizeof(*this));};
	inline bool insert(int x){
		if(p[x]!=0) return false;
		p[x]=x;
		return true;
	}
	inline int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
}s;
using namespace std;
int n,cost[MAXV][MAXV],sz;//[1...n*n]
inline void add(int u,int v,int w){
	st[++sz].u=u;
	st[sz].v=v;
	st[sz].w=w;
}
inline void add_edge(int u,int v,int w){
	add(u,v,w);
	add(v,u,w);
}
int Kruskal(){
	int ans=0;
	sort(st+1,st+1+sz);
	for(int i=1;i<=sz;i++) s.p[i]=i;
	for(int i=1;i<=sz;i++) {
		int x=s.find(st[i].u),y=s.find(st[i].v);
		if(x!=y) ans+=st[i].w;s.p[x]=y;
	}
	return ans;
}
int main(){
	freopen("mcst.in","r",stdin);
	freopen("mcst.out","w",stdout);
	cin>>n;
	int w;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
		cin>>w;
		if(w==-1) continue;
		else add_edge(i,j,w);
	}
	cout<<Kruskal();
	
}