Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 27781 | Accepted: 12690 |
Description
Input
Output
Sample Input
1 3 0 990 692 990 0 179 692 179 0
Sample Output
692
Hint
/* * Copyright (c) 2016, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:prim.cpp * 作 者:单昕昕 * 完成日期:2016年6月1日 * 版 本 号:v1.0 */ #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> #define MAXN 1010 #define INF 0xfffffff//0X代表16进制,后面是数字,十进制是4294967295 using namespace std; int cost[MAXN][MAXN],dis[MAXN],mincost[MAXN],n,t; bool used[MAXN];//标识是否使用过 void prim() { fill(mincost,mincost+n,INF); fill(used,used+n,false); mincost[0]=0; int res=0,Max=-1; while(true) { int v=-1; for(int u=0; u<n; ++u) {//从不属于已加入生成树的顶点中选取从已加入生成树的点到该顶点的权值最小的点 if(!used[u]&&(v==-1||mincost[u]<mincost[v])) v=u; } if(v==-1) break; used[v]=true; Max=max(Max,mincost[v]); //res+=mincost[v]; for(int u=0; u<n; ++u) mincost[u]=min(mincost[u],cost[v][u]); } cout<<Max<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { cin>>n; /*for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) cost[i][j]=INF;*/ for(int i=0; i<n; i++) for(int j=0; j<n; ++j) cin>>cost[i][j]; prim(); } return 0; } /* 1 3 0 990 692 990 0 179 692 179 0 */
/* * Copyright (c) 2016, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:prim.cpp * 作 者:单昕昕 * 完成日期:2016年3月30日 * 版 本 号:v1.0 */ #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> #define MAXN 10010 #define INF 0xfffffff//0X代表16进制,后面是数字,十进制是4294967295 using namespace std; int cost[MAXN][MAXN],dis[MAXN],pre[MAXN],n,cnt; bool used[MAXN];//标识是否使用过 struct edge { int u,v,cost; }; bool cmp(const edge &e1,const edge &e2) { return e1.cost<e2.cost; } edge es[MAXN]; int V,E;//顶点数和边数 int set_find(int x) { while(x!=pre[x]) x=pre[x]; return x; } void unite(int p,int q) { p=set_find(p); q=set_find(q); if(p!=q) pre[p]=q; } bool same(int x,int y) { return set_find(x)==set_find(y); } void init_union_find(int n) { for(int i=0; i<=n; i++) pre[i]=i; } void kruskal() { sort(es,es+cnt,cmp);//按照edge.cost的顺序升序排列 init_union_find(V);//并查集初始化 //int res=0; int Max=-1; for(int i=0; i<E; ++i) { edge e=es[i]; if(!same(e.u,e.v)) { unite(e.u,e.v); //res+=e.cost; Max=max(Max,e.cost); } } cout<<Max<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { cin>>n; cnt=0; /*for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) cost[i][j]=INF;*/ for(int i=0; i<n; i++) for(int j=0; j<n; ++j) { es[cnt].u=i; es[cnt].v=j; cin>>es[cnt++].cost; } V=n; E=n*n; kruskal(); } return 0; } /* 1 3 0 990 692 990 0 179 692 179 0 */