题解:克鲁斯卡尔ac,然而我的prime wawawa;克鲁斯卡尔想法,把0代表引水花费,然后最小生成树就可以了,prime想复杂了,想着比较连接城市的花费与直接引水花费比较的;但是wa;
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define P_ printf(" ")
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
const int MAXN=350;
struct Node{
int u,v,w;
Node init(int x=0,int y=0,int z=0)/*:u(x),v(y),w(z)*/{
u=x;v=y;w=z;
}
friend bool operator < (Node a,Node b){
return a.w<b.w;
}
}dt[1010];
int ans;
int pre[MAXN];
int find(int x){
return pre[x]=x==pre[x]?x:find(pre[x]);
}
void merge(Node a){
int f1=find(a.u),f2=find(a.v);
if(f1!=f2)pre[f1]=f2,ans+=a.w;
}
int main(){
int K,N;
SI(K);
while(K--){
SI(N);
int x,k=0;
for(int i=0;i<=N;i++)
for(int j=1;j<=N;j++){
SI(x);
if(i<j){
dt[k++].init(i,j,x);
}
}
sort(dt,dt+k);
//for(int i=0;i<k;i++)printf("%d %d %d\n",dt[i].u,dt[i].v,dt[i].w);
for(int i=0;i<=N;i++)pre[i]=i;
ans=0;
for(int i=0;i<k;i++)merge(dt[i]);
printf("%d\n",ans);
}
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define P_ printf(" ")
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
const int MAXN=350;
int w[MAXN];
int p[MAXN][MAXN];
int N;
int dis[MAXN];
int vis[MAXN];
int usd[MAXN];
void prim(){
mem(vis,0);
// mem(usd,0);
for(int i=0;i<=N;i++)dis[i]=p[0][i];
vis[0]=1;
int ans=0,flot=0;
while(true){
int temp=INF,k;
for(int i=0;i<=N;i++)
if(!vis[i]&&temp>dis[i])temp=dis[k=i];
if(temp==INF)break;
//printf("%d %d %d\n",k,w[k],temp);
// if(temp<w[k])ans+=temp;
// else ans+=w[k],usd[k]=1;
ans+=temp;
vis[k]=1;
for(int i=0;i<=N;i++)
if(!vis[i])dis[i]=min(dis[i],p[k][i]);
}
/*int x=INF;
for(int i=0;i<N;i++)
if(!usd[i])x=min(x,w[i]);*/
printf("%d\n",ans);//
}
int main(){
int K;
SI(K);
while(K--){
SI(N);
//for(int i=0;i<N;i++)SI(w[i]);
for(int i=0;i<=N;i++)
for(int j=1;j<=N;j++)
SI(p[i][j]);
prim();
}
return 0;
}