Connect the Cities
Each test case starts with three integers: n, m and k. n (3 <= n <=500) stands for the number of survived cities, m (0 <= m <= 25000) stands for the number of roads you can choose to connect the cities and k (0 <= k <= 100) stands for the number of still connected cities.
To make it easy, the cities are signed from 1 to n.
Then follow m lines, each contains three integers p, q and c (0 <= c <= 1000), means it takes c to connect p and q.
Then follow k lines, each line starts with an integer t (2 <= t <= n) stands for the number of this connected cities. Then t integers follow stands for the id of these cities.
最小生成樹 Prime 模板 Kruskal 超時
已AC代碼:(Prime)
#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f
#define M 510
int map[M][M],vis[M],cost[M];
int n,m,k;
void prime()
{
int i,j,min,sum=0,pos;
for(i=1;i<=n;++i)
{
vis[i]=0;
cost[i]=map[1][i];
}
vis[1]=1;pos=1;
for(i=1;i<n;++i)
{
min=INF;
for(j=1;j<=n;++j)
{
if(vis[j]==0 && min>cost[j])
{
min=cost[j];
pos=j;
}
}
if(min>=INF)
{
printf("-1\n");
return ;
}
vis[pos]=1;
sum+=min;
for(j=1;j<=n;++j)
if(vis[j]==0 && cost[j]>map[pos][j])
cost[j]=map[pos][j];
}
printf("%d\n",sum);
return ;
}
int main()
{
int T,i,j,a,b,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
memset(map,INF,sizeof(map));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=map[b][a]=c;
}
int g[M];
while(k--)
{
scanf("%d",&a);
for(i=0;i<a;++i)
scanf("%d",&g[i]);
for(i=0;i<a;++i)
for(j=i+1;j<a;++j)
map[g[i]][g[j]]=map[g[j]][g[i]]=0;
}
prime();
}
return 0;
}