最小生成树模板:
AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define eps 1e-6
using namespace std;
const int maxn = 110;
const int INF = 1e9;
int N;
int Map[maxn][maxn];
void initMap()
{
for(int i = 1; i <= N ; i++)
{
Map[i][i] = 0;
for(int j = i+1; j <= N; j++)
{
Map[i][j] = Map[j][i] = INF;
}
}
}
int lowcost[maxn];
int minCost;
void prim(int s)
{
for(int i = 1; i <= N; i++)
{
lowcost[i] = Map[s][i];
}
lowcost[s] = -1;
int u;
int mst = 0;
for(int i = 1; i < N; i++)
{
minCost = INF;
u = 0;
for(int j = 1; j <= N; j++)
{
if(lowcost[j] != -1 && lowcost[j] < minCost)
{
minCost = lowcost[j];
u = j;
}
}
if(u == 0)
break;
lowcost[u] = -1;
mst += minCost;
for(int j = 1; j <= N; j++)
{
if(Map[u][j] < INF && Map[u][j]<lowcost[j])
{
lowcost[j] = Map[u][j];
}
}
}
printf("%d\n",mst);
}
int main()
{
while(~scanf("%d",&N))
{
initMap();
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= N; j++)
{
scanf("%d",&Map[i][j]);
}
}
int Q,u,v;
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&u,&v);
Map[u][v] = Map[v][u] = 0;
}
prim(1);
}
return 0;
}