整套题都没什么难度、
POJ 1251 Jungle Roads

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 210; struct Edge { int u,v,w; friend bool operator < (const Edge &a,const Edge &b) { return a.w < b.w; } }edge[100010]; int fa[MAXN]; int M; int Find(int x){return x == fa[x] ? x : fa[x] = Find(fa[x]);} void kruskal(int N) { for (int i = 0 ; i < MAXN ; i++) fa[i] = i; sort(edge,edge + M); int cnt = 0; int ret = 0; for (int i = 0 ; i < M ; i++) { int fu = Find(edge[i].u); int fv = Find(edge[i].v); if (fu != fv) { fa[fv] = fu; cnt++; ret += edge[i].w; } if (cnt >= N - 1) break; } printf("%d ",ret); } int main() { int N; while (scanf("%d",&N) != EOF) { if (N == 0) break; M = 0; for (int i = 0 ; i < N - 1; i++) { char op[5]; int tot; scanf("%s%d",op,&tot); int id = op[0] - 'A'; while (tot--) { int val; char tag[5]; scanf("%s%d",tag,&val); edge[M].u = id; edge[M].v = tag[0] - 'A'; edge[M].w = val; M++; } } kruskal(N); } return 0; }
POJ 1287 Networking

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 70; const int INF = 0x3f3f3f3f; int dis[MAXN][MAXN]; int lowcost[MAXN]; bool vis[MAXN]; void prim(int N) { memset(vis,false,sizeof(vis)); for (int i = 0 ; i < MAXN ; i++) lowcost[i] = dis[1][i]; vis[1] = true; lowcost[1] = 0; int ret = 0; for (int i = 1 ; i <= N ; i++) { int mincost = INF; int pos = -1; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] < mincost) { pos = j; mincost = lowcost[j]; } } if (pos == -1) break; ret += mincost; vis[pos] = true; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] > dis[pos][j]) lowcost[j] = dis[pos][j]; } } printf("%d ",ret); } int main() { int N,M; while (scanf("%d",&N) != EOF) { if (N == 0) break; scanf("%d",&M); memset(dis,0x3f,sizeof(dis)); for (int i = 0 ; i < M ; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); dis[u][v] = min(dis[u][v],w); dis[v][u] = min(dis[v][u],w); } prim(N); } return 0; }
POJ 2031 Building a Space Station

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 110; const double eps = 1e-8; struct circle { double x,y,z; double r; }src[MAXN]; struct Edge { int u,v; double w; friend bool operator < (const Edge &a,const Edge &b) { return a.w < b.w; } }edge[MAXN * MAXN]; int tot,N; int fa[MAXN]; int Find(int x){return x == fa[x] ? x : fa[x] = Find(fa[x]);} void kruskal(int N) { double ret = 0; int cnt = 0; for (int i = 0 ; i < tot ; i++) { int fu = Find(edge[i].u); int fv = Find(edge[i].v); if (fu != fv) { ret += edge[i].w; fa[fv] = fu; cnt++; } if (cnt >= N - 1) break; } printf("%.3lf ",ret); } int main() { while (scanf("%d",&N) != EOF) { if (N == 0) break; for (int i = 1 ; i <= N ; i++) scanf("%lf%lf%lf%lf",&src[i].x,&src[i].y,&src[i].z,&src[i].r); tot = 0; for (int i = 0 ; i <= N ; i++) fa[i] = i; for (int i = 1 ; i <= N ; i++) { for (int j = i + 1 ; j <= N ; j++) { double dis = sqrt((src[i].x - src[j].x) * (src[i].x - src[j].x) + (src[i].y - src[j].y) * (src[i].y - src[j].y) + (src[i].z - src[j].z) * (src[i].z - src[j].z)); if (dis > src[i].r + src[j].r) { edge[tot].u = i; edge[tot].v = j; edge[tot].w = dis - src[i].r - src[j].r; tot++; } else { int fi = Find(i),fj = Find(j); if (fi != fj) { fa[fj] = fi; } } } } sort(edge,edge + tot); kruskal(N); } return 0; }
POJ 2421 Constructing Roads

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 210; const int INF = 0x3f3f3f3f; int dis[MAXN][MAXN]; int lowcost[MAXN]; bool vis[MAXN]; void prim(int N) { memset(vis,false,sizeof(vis)); for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i]; lowcost[1] = 0; vis[1] = true; int ret = 0; for (int i = 1 ; i <= N ; i++) { int mincost = INF; int pos = -1; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] < mincost) { mincost = lowcost[j]; pos = j; } } if (pos == -1) break; ret += mincost; vis[pos] = true; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] > dis[pos][j]) lowcost[j] = dis[pos][j]; } } printf("%d ",ret); } int main() { int N,M; while (scanf("%d",&N) != EOF) { for (int i = 1 ; i <= N ; i++) for (int j = 1 ; j <= N ; j++) scanf("%d",&dis[i][j]); int Q; scanf("%d",&Q); while (Q--) { int u,v; scanf("%d%d",&u,&v); int tmp = dis[u][v]; dis[u][v] = dis[v][u] = 0; } prim(N); } return 0; }
ZOJ 1586 QS Network

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 1010; const int MAXM = MAXN * MAXN; struct Edge { int u,v,w; friend bool operator < (const Edge &a,const Edge &b) { return a.w < b.w; } }edge[MAXM]; int fa[MAXN],price[MAXN]; int tot; int Find(int x) {return x == fa[x] ? x : fa[x] = Find(fa[x]);} void kruskal(int N) { for (int i = 0 ; i <= N ; i++) fa[i] = i; sort(edge,edge + tot); int cnt = 0 ,ret = 0; for (int i = 0 ; i < tot ; i++) { int fu = Find(edge[i].u); int fv = Find(edge[i].v); if (fu != fv) { fa[fv] = fu; cnt++; ret += edge[i].w; } if (cnt >= N - 1) break; } printf("%d ",ret); } int main() { int T; scanf("%d",&T); while (T--) { int N; scanf("%d",&N); for (int i = 1 ; i <= N ; i++) scanf("%d",&price[i]); tot = 0; for (int i = 1 ; i <= N ; i++) { for (int j = 1 ; j <= N ; j++) { int x; scanf("%d",&x); if (i < j) { edge[tot].u = i; edge[tot].v = j; edge[tot++].w = x + price[i] + price[j]; } } } kruskal(N); } return 0; }
POJ 1789 Truck History

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 2010; const int INF = 0x3f3f3f3f; int dis[MAXN][MAXN]; char word[MAXN][10]; int lowcost[MAXN]; bool vis[MAXN]; void prim(int N) { memset(vis,false,sizeof(vis)); for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i]; vis[1] = true; lowcost[1] = 0; int ret = 0; for (int i = 1 ; i <= N ; i++) { int mincost = INF; int pos = -1; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] < mincost) { mincost = lowcost[j]; pos = j; } } if (pos == -1) break; vis[pos] = true; ret += mincost ; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] > dis[pos][j]) lowcost[j] = dis[pos][j]; } } printf("The highest possible quality is 1/%d. ",ret); } int cal(int x,int y) { int cnt = 0; for (int i = 0 ; i < 7 ; i++) if (word[x][i] != word[y][i]) cnt++; return cnt; } int main() { int N; while (scanf("%d",&N) != EOF) { if (N == 0) break; for (int i = 1 ; i <= N ; i++) scanf("%s",word[i]); for (int i = 1 ; i <= N ; i++) { for (int j = i + 1 ; j <= N ; j++) { int dist = cal(i,j); dis[i][j] = dist; dis[j][i] = dist; } } prim(N); } return 0; }
POJ 2349 Arctic Network

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 510; const int MAXM = MAXN * MAXN; int fa[MAXN]; int Find(int x) {return x == fa[x] ? x : fa[x] = Find(fa[x]);} struct node { double x,y; }src[MAXN]; struct Edge { int u,v; double w; friend bool operator <(const Edge &a,const Edge & b) { return a.w < b.w; } }edge[MAXM]; int S,P; vector<double>ans; int cas; void build() { cas = 0; for (int i = 1 ; i <= P ; i++) scanf("%lf%lf",&src[i].x,&src[i].y); for (int i = 1 ; i <= P ; i++) { for (int j = i + 1 ; j <= P ; j++) { double dis = sqrt((src[j].x - src[i].x) * (src[j].x - src[i].x) + (src[j].y - src[i].y) * (src[j].y - src[i].y)); edge[cas].u = i; edge[cas].v = j; edge[cas].w = dis; cas++; edge[cas].v = i; edge[cas].u = j; edge[cas].w = dis; cas++; } } } int cmp(const double &a,const double &b) { return a > b; } void kruskal() { for (int i = 0 ; i <= P ; i++) fa[i] = i; double ret = 0; int cnt = 0; ans.clear(); sort(edge,edge + cas); for (int i = 0 ; i < cas ; i++) { int fu = Find(edge[i].u); int fv = Find(edge[i].v); if (fu != fv) { cnt++; ret += edge[i].w; ans.push_back(edge[i].w); fa[fu] = fv; } if (cnt >= P - 1) break; } //printf("%lf ",ret); sort(ans.begin(),ans.end(),cmp); if (S >= P) printf("0.00 "); else { S--; printf("%.2f ",ans[S]); } //printf("%.2lf ",max(ret,0.0)); } int main() { int T; scanf("%d",&T); while (T--) { scanf("%d%d",&S,&P); build(); kruskal(); } return 0; }
POJ 1751 Highways

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 760; int fa[MAXN]; int Find(int x) {return x == fa[x] ? x : fa[x] = Find(fa[x]);} int x[MAXN],y[MAXN]; struct Edge { int u,v,w; friend bool operator < (const Edge &a,const Edge &b) { return a.w < b.w; } }edge[MAXN * MAXN / 2]; int N,tot; void kruskal(int N) { sort(edge,edge + tot); int cnt = 0; for (int i = 0 ; i < tot ; i++) { int fu = Find(edge[i].u); int fv = Find(edge[i].v); if (fu != fv) { printf("%d %d ",edge[i].u,edge[i].v); fa[fv] = fu; cnt++; } if (cnt >= N - 1) break; } } int main() { scanf("%d",&N); { tot = 0; for (int i = 1 ; i <= N ; i++)scanf("%d%d",&x[i],&y[i]); for (int i = 1 ; i <= N ; i++) { for (int j = i + 1 ; j <= N ; j++) { int tmp = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]); edge[tot].u = i; edge[tot].v = j; edge[tot].w = tmp; tot++; } } for (int i = 1 ; i <= N ; i++) fa[i] = i; int M; scanf("%d",&M); while (M--) { int u,v; scanf("%d%d",&u,&v); int fu = Find(u); int fv = Find(v); if (fu != fv) { fa[fv] = fu; } } kruskal(N); } return 0; }
POJ 1258 Agri-Net

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 110; const int INF = 0x3f3f3f3f; LL lowcost[MAXN]; LL dis[MAXN][MAXN]; bool vis[MAXN]; void prim(int N) { memset(vis,false,sizeof(vis)); for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i]; lowcost[1] = 0; vis[1] = true; LL ret = 0; for (int i = 1 ; i <= N ; i++) { int mincost = INF; int pos = -1; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] < mincost) { mincost = lowcost[j]; pos = j; } } if (pos == -1) break; ret += mincost; vis[pos] = true; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] > dis[pos][j]) lowcost[j] = dis[pos][j]; } } printf("%lld ",ret); } int main() { int N; while (scanf("%d",&N) != EOF) { for (int i = 1 ; i <= N ; i++) for (int j = 1 ; j <= N ; j++) scanf("%lld",&dis[i][j]); prim(N); } return 0; }
POJ 3026 Borg Maze
这道题我就也无语了。看了Discuss就知道他究竟就多多多多多坑,呵呵

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 210; const int INF = 0x3f3f3f3f; const int MAXD = 210; const int dx[] = {0,0,1,-1}; const int dy[] = {1,-1,0,0}; char G[MAXN][MAXN]; queue<pair<int,int> >q; int N,M; int dis[MAXN][MAXN]; int dist[MAXD][MAXD]; bool vis[MAXD][MAXD]; int id[MAXN][MAXN],tot; void bfs(int x,int y) { memset(vis,false,sizeof(vis)); int idx = id[x][y]; while (!q.empty()) q.pop(); dist[x][y] = 0; dis[idx][idx] = 0; q.push(make_pair(x,y)); vis[x][y] = true; while (!q.empty()) { pair<int,int>u = q.front(); q.pop(); int fidx = id[u.first][u.second]; for (int d = 0 ; d < 4 ; d++) { int nx = u.first + dx[d]; int ny = u.second + dy[d]; int nidx = id[nx][ny]; if (!vis[nx][ny] && nx >= 1 && nx <= N && ny >= 1 && ny <= M && G[nx][ny] == ' ') { vis[nx][ny] = true; dist[nx][ny] = dist[u.first][u.second] + 1; q.push(make_pair(nx,ny)); } else if (!vis[nx][ny] && nx >= 1 && nx <= N && ny >= 1 && ny <= M && isupper(G[nx][ny])) { vis[nx][ny] = true; dist[nx][ny] = dist[u.first][u.second] + 1; q.push(make_pair(nx,ny)); int nidx = id[nx][ny]; dis[idx][nidx] = dist[nx][ny]; } } } } int lowcost[MAXN]; bool used[MAXN]; void prim(int N) { memset(used,false,sizeof(used)); for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i]; lowcost[1] = 0; used[1] = true; int ret = 0; for (int i = 1 ; i <= N ; i++) { int mincost = INF; int pos = -1; for (int j = 1 ; j <= N ; j++) { if (!used[j] && lowcost[j] < mincost) { mincost = lowcost[j]; pos = j; } } if (pos == -1) break; ret += mincost; used[pos] = true; for (int j = 1 ; j <= N ; j++) { if (!used[j] && lowcost[j] > dis[pos][j]) lowcost[j] = dis[pos][j]; } } printf("%d ",ret); } int main() { int T; char tmp[300]; scanf("%d",&T); while (T--) { scanf("%d%d",&M,&N); gets(tmp); memset(id,-1,sizeof(id)); int cas = 0; for (int i = 1 ; i <= N ; i++)gets(G[i] + 1); for (int i = 1 ; i <= N ; i++) { for (int j = 1 ; j <= M ; j++) if (G[i][j] == 'A' || G[i][j] == 'S') id[i][j] = ++cas; } for (int i = 1 ; i <= N ; i++) { for (int j = 1 ; j <= M ; j++) if (isupper(G[i][j])) bfs(i,j); } prim(cas); } return 0; }
POJ 1679 The Unique MST
求次小生成树

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 210; const int INF = 0x3f3f3f3f; bool vis[MAXN]; int cost[MAXN][MAXN]; int lowcost[MAXN]; int pre[MAXN],MAX[MAXN][MAXN]; bool used[MAXN][MAXN]; int prim(int cost[][MAXN],int n) { int ret = 0; memset(vis,false,sizeof(vis)); memset(MAX,0,sizeof(MAX)); memset(used,false,sizeof(used)); vis[1] = true; pre[1] = -1; for (int i = 1 ; i <= n ; i++) { lowcost[i] = cost[1][i]; pre[i] = 1; } lowcost[1] = 0; pre[1] = -1; for (int i = 2 ; i <= n ; i++) { int mincost = INF; int pos = -1; for (int j = 1 ; j <= n ; j++) { if (!vis[j] && lowcost[j] < mincost) { mincost = lowcost[j]; pos = j; } } if (pos == -1) return -1; ret += mincost; vis[pos] = true; used[pos][pre[pos]] = used[pre[pos]][pos] = true; for (int j = 1; j <= n ; j++) { if (vis[j]) MAX[j][pos] = MAX[pos][j] = max(MAX[j][pre[pos]],lowcost[pos]); if (!vis[j] && lowcost[j] > cost[pos][j]) { lowcost[j] = cost[pos][j]; pre[j] = pos; } } } return ret; } int calcusmst(int cost[][MAXN],int n,int ret) { int MIN = INF; for (int i = 1 ; i <= n ; i++) { for (int j = i + 1 ; j <= n ; j++) { if (cost[i][j] < INF && !used[i][j]) MIN = min(MIN,ret + cost[i][j] - MAX[i][j]); } } if (MIN == INF) return -1; return MIN; } int main() { int T,N,M; scanf("%d",&T); while (T--) { scanf("%d%d",&N,&M); for (int i = 0 ; i <= N ; i++) for (int j = 0 ; j <= N ; j++) cost[i][j] = i == j ? 0 : INF; while (M--) { int u,v,w; scanf("%d%d%d",&u,&v,&w); cost[u][v] = cost[v][u] = w; } int ret = prim(cost,N); if (ret == -1) { printf("Not Unique! "); continue; } if (ret == calcusmst(cost,N,ret)) printf("Not Unique! "); else printf("%d ",ret); } return 0; }
HDU 1233 还是畅通工程

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 110; const int INF = 0x3f3f3f3f; int dis[MAXN][MAXN]; int lowcost[MAXN]; bool vis[MAXN]; void prim(int N) { memset(vis,false,sizeof(vis)); for (int i = 0 ; i <= N ; i++) lowcost[i] = dis[1][i]; vis[1] = true; lowcost[1] = 0; int ret = 0; for (int i = 1 ; i <= N ; i++) { int mincost = INF; int pos = -1; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] < mincost) { mincost = lowcost[j]; pos = j; } } if (pos == -1) break; ret += mincost; vis[pos] = true; for (int j = 1 ; j <= N ; j++) { if (!vis[j] && lowcost[j] > dis[pos][j]) lowcost[j] = dis[pos][j]; } } printf("%d ",ret); } int main() { int N; while (scanf("%d",&N) != EOF) { if (N == 0) break; for (int i = 1 ; i <= N ; i++) for (int j = 1 ; j <= N ; j++) dis[i][j] = i == j ? 0 : INF; int tmp = N * (N - 1) / 2; for (int i = 0 ; i < tmp ; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); dis[u][v] = dis[v][u] = w; } prim(N); } return 0; }
HDU 1301 Jungle Roads

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 210; struct Edge { int u,v,w; friend bool operator < (const Edge &a,const Edge &b) { return a.w < b.w; } }edge[100010]; int fa[MAXN]; int M; int Find(int x){return x == fa[x] ? x : fa[x] = Find(fa[x]);} void kruskal(int N) { for (int i = 0 ; i < MAXN ; i++) fa[i] = i; sort(edge,edge + M); int cnt = 0; int ret = 0; for (int i = 0 ; i < M ; i++) { int fu = Find(edge[i].u); int fv = Find(edge[i].v); if (fu != fv) { fa[fv] = fu; cnt++; ret += edge[i].w; } if (cnt >= N - 1) break; } printf("%d ",ret); } int main() { int N; while (scanf("%d",&N) != EOF) { if (N == 0) break; M = 0; for (int i = 0 ; i < N - 1; i++) { char op[5]; int tot; scanf("%s%d",op,&tot); int id = op[0] - 'A'; while (tot--) { int val; char tag[5]; scanf("%s%d",tag,&val); edge[M].u = id; edge[M].v = tag[0] - 'A'; edge[M].w = val; M++; } } kruskal(N); } return 0; }
HDU 1875 畅通工程再续

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 210; const double INF = 1e14; double dis[MAXN][MAXN]; double lowcost[MAXN]; bool vis[MAXN]; double x[MAXN],y[MAXN]; double prim(int n) { memset(vis,false,sizeof(vis)); for (int i = 0 ; i <= n ; i++) lowcost[i] = dis[1][i]; vis[1] = true; lowcost[1] = 0; double ret = 0; for (int i = 1 ; i <= n ; i++) { double mincost = INF; int pos = -1; for (int j = 1 ; j <= n ; j++) { if (!vis[j] && lowcost[j] < mincost) { mincost = lowcost[j]; pos = j; } } if (pos == -1) break; vis[pos] = true; ret += mincost; for (int j = 1 ; j <= n ; j++) { if (!vis[j] && lowcost[j] > dis[pos][j]) lowcost[j] = dis[pos][j]; } } return ret; } int main() { int T; scanf("%d",&T); while (T--) { int N; scanf("%d",&N); for (int i = 1 ; i <= N ; i++) { scanf("%lf%lf",&x[i],&y[i]); } for (int i = 1 ; i <= N ; i++) for (int j = 1 ; j <= N ; j++) dis[i][j] = i == j ? 0 : INF; for (int i = 1 ; i <= N ; i++) { for (int j = i + 1 ; j <= N ; j++) { double dist = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); // printf("%lf ",dist); if (dist >= 10.0 && dist < 1000) { dis[i][j] = dis[j][i] = dist; // printf("%lf ",dist); } } } // for (int i = 1 ; i <= N ; i++) // for (int j = 1 ; j <= N ; j++) printf("%lf%c",dis[i][j],j == N ? ' ' : ' '); double ret = prim(N); if (ret >= INF || ret == 0.0) puts("oh!"); else { ret *= 100.0; printf("%.1lf ",ret); } } return 0; }