用Kruskal没优化:超时 改prim
cin : 超时
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
//const int mod=;
#define INF 0x3f3f3f3f
const int maxn=510;
int n,m,k;
int mp[maxn][maxn];
int d[maxn];
bool vis[maxn];
void prim(){
int ans = 0;
int flot = 0;
memset(vis,0,sizeof(vis));
vis[1] = 1;
for(int i=1; i<=n; i++)
d[i] = mp[1][i];
for(int i=1; i<=n; i++){
int mmin = INF;
int end = -1;
for(int j=1; j<=n; j++){
if(!vis[j] && d[j]<mmin){
end = j;
mmin = d[j];
}
}
if(mmin == INF){
if(flot==n-1)
printf("%d\n",ans);
else
printf("-1\n");
return ;
}
vis[end] = 1;
flot++;
ans += mmin;
for(int j=1; j<=n; j++)
if(!vis[j] && d[j]>mp[end][j])
d[j] = mp[end][j];
}
}
int main(void){
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&m,&k);
memset(mp,INF,sizeof(mp));
int a,b,c;
while(m--){
scanf("%d %d %d",&a,&b,&c);
if(c<mp[a][b])
mp[a][b] = mp[b][a] = c;
}
while(k--){
scanf("%d %d",&a,&b);
while(--a){
scanf("%d",&c);
mp[b][c] = mp[c][b] = 0;
}
}
prim();
}
return 0;
}
不知道为什么改成
int end = -1;
for(int j=1; j<=n; j++){
if(!vis[j] && (end==-1 || d[j]<d[end]))
end = j;
}
if(end == -1){
if(flot==n-1)
printf("%d\n",ans);
else
printf("-1\n");
return ;
}
vis[end] = 1;
flot++;
ans += d[end];
for(int j=1; j<=n; j++)
if(!vis[j] && d[j]>mp[end][j])
d[j] = mp[end][j];
会错