都是纯板子题
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<cstdlib>
//#include<windows.h>
#define first fi
#define second se
using namespace std;
typedef long long ll;
const int N = 1e6+10;
const int INF = 0x3f3f3f3f;
const int inf = - INF;
const int mod = 1e9+7;
const double pi = acos(-1.0);
int n,m;
int father[505];
void init(){
m=0;
memset(father,-1,sizeof(father));
}
struct node {
int u,v,w;
node(){}
node(int u,int v, int w):u(u),v(v),w(w){}
bool operator < (const node &rhs)const{
return w < rhs.w;
}
}edge[N];
int Find(int x){
return father[x]==-1?x:father[x]=Find(father[x]);
}
int Kruskal(){
int maxn=-1;
int cnt=0;
for(int i=0;i<m;i++){
int u=edge[i].u;
int v=edge[i].v;
if(Find(u)!=Find(v)){
father[Find(u)]=Find(v);
maxn=max(maxn,edge[i].w);
if(++cnt>=n-1) return maxn;
}
}
return -1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
init();
int t;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&t);
edge[m++]=node(i,j,t);
}
}
sort(edge,edge+m);
printf("%d\n",Kruskal());
}
//system("pause");
return 0;
}1258可以直接用2485改改就交,注意要多组输入。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<cstdlib>
#include<windows.h>
#define first fi
#define second se
using namespace std;
typedef long long ll;
const int N = 1e6+10;
const int INF = 0x3f3f3f3f;
const int inf = - INF;
const int mod = 1e9+7;
const double pi = acos(-1.0);
ll n,m;
ll father[505];
void init(){
m=0;
memset(father,-1,sizeof(father));
}
struct node {
ll u,v,w;
node(){}
node(ll u,ll v, ll w):u(u),v(v),w(w){}
bool operator < (const node &rhs)const{
return w < rhs.w;
}
}edge[N];
ll Find(int x){
return father[x]==-1?x:father[x]=Find(father[x]);
}
ll Kruskal(){
ll sum=0;
ll cnt=0;
for(ll i=0;i<m;i++){
ll u=edge[i].u;
ll v=edge[i].v;
if(Find(u)!=Find(v)){
father[Find(u)]=Find(v);
sum+=edge[i].w;
if(++cnt>=n-1) return sum;
}
}
return -1;
}
int main(){
//int T;
//scanf("%d",&T);
while(~scanf("%lld",&n)){//注意多组输入
init();
ll t;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
scanf("%lld",&t);
edge[m++]=node(i,j,t);
}
}
sort(edge,edge+m);
printf("%d\n",Kruskal());
}
system("pause");
return 0;
}
京公网安备 11010502036488号