先推荐下次下生成树的相关概念问题的描述。
http://blog.csdn.net/jarily/article/details/8883858
这个懂了次小生成树的解法就是判断次小是否等于最小。。。。。。。就是模版!
/***************************************** Author :Crazy_AC(JamesQi) Time :2015 File Name : *****************************************/ // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <string> #include <stack> #include <queue> #include <deque> #include <vector> #include <map> #include <set> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <climits> using namespace std; #define MEM(x,y) memset(x, y,sizeof x) #define pk push_back typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> ii; typedef pair<ii,int> iii; const double eps = 1e-10; const int inf = 1 << 30; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; const int N = 110; int G[N][N]; int pre[N], mark[N], dis[N], path[N][N]; bool Used[N][N]; int n, m; int Prim() { int ret = 0; memset(mark, 0,sizeof mark); memset(Used, false,sizeof Used); memset(path, 0,sizeof path); mark[1] = true; for (int i = 1;i <= n;++i) { dis[i] = G[1][i]; pre[i] = 1; } for (int i = 1;i < n;++i) { int u = -1; for (int j = 1;j <= n;++j) { if (!mark[j]) { if (u == -1 || dis[j] < dis[u]) u = j; } } Used[u][pre[u]] = Used[pre[u]][u] = true; ret += G[pre[u]][u]; mark[u] = true; for (int j = 1;j <= n;++j) { if (mark[j] && j != u) { path[j][u] = path[u][j] = max(dis[u], path[j][pre[u]]); } if (!mark[j] && dis[j] > G[u][j]) { dis[j] = G[u][j]; pre[j] = u; } } } return ret; } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(G, INF,sizeof G); int u, v, w; for (int i = 1;i <= m;++i) { scanf("%d%d%d",&u,&v,&w); G[u][v] = G[v][u] = w; } int ans = Prim(); int res = INF; for (int i = 1;i <= n;++i) { for (int j = i + 1;j <= n;++j) { if (!Used[i][j]) res = min(res,ans + G[i][j] - path[i][j]); } } if (res == ans) puts("Not Unique!"); else printf("%d\n", ans); } return 0; }