#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int g[N][N];
int dist[N];
int n;
bool st[N];
int prim(){
int res=0;
memset(dist,0x3f,sizeof dist);
dist[1]=0;
for(int i=1;i<=n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[j]<dist[t])){
t=j;
}
}
st[t]=true;
res+=dist[t];
for(int j=1;j<=n;j++){
dist[j]=min(dist[j],g[t][j]);
}
}
return res;
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin >> g[i][j];
}
}
cout << prim();
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int p[N];
struct Node{
int a,b,c;
}e[N];
int n,k;
bool cmp(Node a,Node b){
return a.c<b.c;
}
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(){
cin >> n >> k ;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=k;i++){
int a,b,c;
cin >> a >> b >> c;
e[i]={a,b,c};
}
int res=0;
sort(e+1,e+1+k,cmp);
for(int i=1;i<=k;i++){
int x=e[i].a,y=e[i].b;
int fx=find(x),fy=find(y);
if(fx==fy){
res+=e[i].c;
}
else {
p[fx]=fy;
}
}
cout << res << endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
struct edge{
int a,b,w;
bool operator < (const edge &e) const{
return w<e.w;
}
}e[N];
int n,m;
int p[N];
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=m;i++){
int a,b,c;
cin >> a >> b >> c;
e[i]={a,b,c};
}
sort(e+1,e+m+1);
int res=0;
int cnt=0;
for(int i=1;i<=m;i++){
int x=e[i].a,y=e[i].b,w=e[i].w;
if(find(x)!=find(y)){
cnt++;
p[find(x)]=find(y);
res=w;
}
}
cout << cnt<<" "<<res;
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10010;
struct edge{
int a,b,w;
bool operator < (const edge &e)const{
return w<e.w;
}
}e[N];
int p[N];
int n,m;
int res;
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++) p[i]=i;
int t=0;
for(int i=1;i<=m;i++){
int r,a,b,w;
cin >> r >> a >> b >> w;
if(r==1){
res+=w;
p[find(a)]=find(b);
}
else{
e[t++]={a,b,w};
}
}
sort(e,e+t);
for(int i=0;i<t;i++){
int a=e[i].a,b=e[i].b,w=e[i].w;
if(find(a)!=find(b)){
res+=w;
p[find(a)]=find(b);
}
}
cout << res << endl;
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
const int N=1010,M=N*N,K=2*N*N;
int dis[N][N];
struct edge{
int a,b,w;
}e[K];
int res=0;
int p[M+10];
int n,m;
int cnt;
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
void get_edges(){
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1},dw[4]={1,2,1,2};
for(int z=0;z<2;z++){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=0;k<4;k++){
if(k%2==z){
int xx=i+dx[k],yy=j+dy[k];
if(xx<=n&&xx>=1&&yy<=m&&yy>=1){
int a=dis[i][j],b=dis[xx][yy];
if(a<b) e[cnt++]={a,b,dw[k]};
}
}
}
}
}
}
}
int main(){
cin >> n >> m;
for(int i=1;i<=M;i++){
p[i]=i;
}
int t=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++,t++){
dis[i][j]=t;
}
}
int x1,y1,x2,y2;
while(cin>>x1>>y1>>x2>>y2){
int a=dis[x1][y1];
int b=dis[x2][y2];
p[find(a)]=find(b);
}
get_edges();
for(int i=0;i<cnt;i++){
int a=e[i].a,b=e[i].b,w=e[i].w;
if(find(a)!=find(b)){
p[find(a)]=find(b);
res+=w;
}
}
cout << res << endl;
return 0;
}
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=10050;
int g[N][N];
int dist[N];
bool st[N];
int n;
int prim(){
memset(dist,0x3f,sizeof dist);
int res=0;
dist[0]=0;
for(int i=0;i<=n;i++){
int t=-1;
for(int j=0;j<=n;j++){
if((t==-1||dist[j]<dist[t])&&!st[j]){
t=j;
}
}
res+=dist[t];
st[t]=true;
for(int j=0;j<=n;j++){
dist[j]=min(dist[j],g[t][j]);
}
}
return res;
}
int main(){
using namespace std;
cin >> n;
for(int i=1;i<=n;i++){
int tmp;
cin >> tmp;
g[0][i]=g[i][0]=tmp;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin >> g[i][j];
}
}
cout << prim();
return 0;
}
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define x first
#define y second
using namespace std;
const int N=550;
pair<int,int>p[N];
struct Edge{
int a,b;
double w;
bool operator < (const Edge &s) const {
return w<s.w;
}
}e[N*N];
int n,k;
double get_dist(pair<int,int> a,pair<int,int> b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int bing[N*N];
int find(int x){
if(x!=bing[x]) bing[x]=find(bing[x]);
return bing[x];
}
int main(){
cin >> n >> k;
for(int i=1;i<=n;i++){
cin >> p[i].x >> p[i].y;
}
for(int i=1;i<=n;i++) bing[i]=i;
int t=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
e[t++]={i,j,get_dist(p[i],p[j])};
}
}
sort(e,e+t);
double res=0;
int cnt=0;
for(int i=0;i<t;i++){
if(cnt==n-k) break;
double a=e[i].a,b=e[i].b;
double w=e[i].w;
if(find(a)!=find(b)){
bing[find(a)]=find(b);
res=w;
cnt++;
}
}
printf("%.2lf",res);
return 0;
}
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=6060;
struct Edge{
int a,b,w;
bool operator < (const Edge &s) const{
return w<s.w;
}
}e[N];
int p[N],sz[N];
int n,t;
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(){
cin >> t;
while(t--){
cin >> n;
for(int i=1;i<=n-1;i++){
int a,b,c;
cin >> a >> b >> c;
e[i]={a,b,c};
}
sort(e+1,e+n);
for(int i=1;i<=n;i++){
p[i]=i;
sz[i]=1;
}
int res=0;
for(int i=1;i<=n-1;i++){
int a=e[i].a,b=e[i].b,w=e[i].w;
if(find(a)!=find(b)){
res+=(w+1)*(sz[find(b)]*sz[find(a)]-1);
sz[find(b)]+=sz[find(a)];
p[find(a)]=find(b);
}
}
cout << res << endl;
}
return 0;
}
参考题解
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=550,M=(1e4+10)*2;
struct Edge{
int a,b,w;
bool in;
bool operator < (const Edge &e) const{
return w<e.w;
}
}e[M];
int ee[M],ne[M],h[M],w[M],idx;
int mx1[N][N],mx2[N][N];
int n,m;
int p[N];
void add(int a,int b,int c){
ee[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int s,int u,int f,int t1,int t2){
mx1[s][u]=t1,mx2[s][u]=t2;
for(int i=h[u];~i;i=ne[i]){
int j=ee[i];
if(j!=f){
int tmp1=t1,tmp2=t2;
if(w[i]>tmp1){
tmp2=tmp1;
tmp1=w[i];
}
else if(w[i]>tmp2&&w[i]<tmp1){
tmp2=w[i];
}
dfs(s,j,u,tmp1,tmp2);
}
}
}
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
signed main(){
memset(h,-1,sizeof h);
cin >> n >> m;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=m;i++){
cin >> e[i].a >> e[i].b >> e[i].w;
}
sort(e+1,e+m+1);
long long res=0;
for(int i=1;i<=m;i++){
int a=e[i].a,b=e[i].b,w=e[i].w;
if(find(a)!=find(b)){
res+=w;
p[find(a)]=find(b);
e[i].in=true;
add(a,b,w),add(b,a,w);
}
}
long long ans=1e18;
for(int i=1;i<=n;i++) dfs(i,i,-1,0,0);
for(int i=1;i<=m;i++){
if(!e[i].in){
int a=e[i].a,b=e[i].b,w=e[i].w;
if(w>mx1[a][b]) ans=min(ans,res+w-mx1[a][b]);
else if(w>mx2[a][b]) ans=min(ans,res+w-mx2[a][b]);
}
}
cout << ans << endl;
return 0;
}
参考题解