題意:
給你一個帶權圖其中有一些道路已經建設完畢,求其最小生成樹
分析:
對於已經建設完畢的道路修改其費用爲0,然後使用Prim或者Kruskal都可以
Code:
Prim
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define DIR 4
#define DIM 2
#define STATUS 2
#define DIS 0
#define MAXN 100 + 10
#define MAXM 100000 + 10
#define oo (~0u)>>1
#define INF 0x3F3F3F3F
#define REPI(i, s, e) for(int i = s; i <= e; i ++)
#define REPD(i, e, s) for(int i = e; i >= s; i --)
static const double EPS = 1e-5;
typedef struct ArcNode_ {
int u, v;
}ArcNode;
int f[MAXN][MAXN], used[MAXN], d[MAXN];
int prim(int src, int n)
{
int cost = 0, min_val, idx;
REPI(i, 1, n) {
used[i] = 0;
d[i] = f[i][src];
}
used[src] = 1;
REPI(j, 2, n) {
min_val = INF;
REPI(i, 1, n) {
if( used[i] ) {
continue;
}
if( min_val > d[i] ) {
min_val = d[i], idx = i;
}
}
used[idx] = 1, cost += min_val;
REPI(i, 1, n) {
if( used[i] ) {
continue;
}
d[i] = min(d[i], f[idx][i]);
}
}
return cost;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int n, m;
while( ~scanf("%d", &n) ) {
REPI(i, 1, n) {
REPI(j, 1, n) {
scanf("%d", &f[i][j]);
}
}
scanf("%d", &m);
int u, v;
REPI(i, 1, m) {
scanf("%d %d", &u, &v);
f[u][v] = f[v][u] = 0;
}
printf("%d\n", prim(1, n));
}
return 0;
}