分析:根据题意,显然利用最小生成树解法比较方便,直接利用prim解法写起来方便一些,利用优先队列进行堆优化,可以减小复杂度.
ps:
这题好坑啊,说的是一组数据,结果是多组数据.............
先上模板:
//int V;
//int ans;
//int mincost[MAXN];
//int used[MAXN];
//struct edge{
//int to,cost;
//edge (){}
//edge (int to,int cost):to(to),cost(cost){}
//};
//vector <edge> G[MAXN];//存放从i出发的边
//typedef pair<int,int> P;//first存放距离,second存放节点
//priority_queue<P,vector<P>,greater<P>> que;
void prim()
{
//初始化
memset(used,0,sizeof(used));
fill(mincost,mincost+V,INF);
ans = 0;
que.push(P(0,0));
while (!que.empty()){
//取最短边
P p = que.top();
que.pop();
int d = p.first,v = p.second;
if (used[v]) continue;
used[v] = 1;
ans += d;
//以最短边的节点为基础,更新最短距离
for (int i = 0; i < G[v].size(); i += 1){
edge e = G [v][i];
if ((mincost[e.to] > e.cost) && !used[i]){
mincost[e.to] = e.cost;
que.push(P(mincost[e.to],e.to));
}
}
}
printf("%d\n",ans);
}
直接上代码,练习下模板使用
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <bitset>
#include <list>
#include <sstream>
#include <set>
#include <functional>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 120
typedef long long ll;
int n,q;
int V;
int res;
int mincost[MAXN];
int used[MAXN];
struct edge{
int to,cost;
edge (){}
edge (int to,int cost):to(to),cost(cost){}
};
vector <edge> G[MAXN];//存放从i出发的边
typedef pair<int,int> P;//first存放距离,second存放节点
priority_queue<P,vector<P>,greater<P>> que;
void prim()
{
memset(used,0,sizeof(used));
fill(mincost,mincost+V,INF);
res = 0;
que.push(P(0,0));
while (!que.empty()){
P p = que.top();
que.pop();
int v = p.second,d = p.first;
if (used[v]) continue;
used[v] = 1;
res += d;
for (int i = 0; i < G[v].size(); i += 1){
edge e = G [v][i];
if ((mincost[e.to] > e.cost) && !used[i]){
mincost[e.to] = e.cost;
que.push(P(mincost[e.to],e.to));
}
}
}
printf("%d\n",res);
}
int main()
{
while (scanf("%d",&n) != EOF){
memset(G,0,sizeof(G));//每次要初始化啊
for (int i = 0; i < n; i += 1){
for (int j = 0; j < n; j += 1){
int a;
cin >> a;
G[i].push_back(edge(j,a));
}
}
cin >> q;
for (int i = 0; i < q; i += 1){
int a,b;
cin >> a >> b;
G[a-1][b-1].cost = G[b-1][a-1].cost = 0;
}
V = n;
prim();
}
return 0;
}