POJ-3164 Command Network (朱刘算法)

这是一道最小树形图的模板题

朱刘算法开始时的确不是太好理解,在网上看了好多文章才差不多理解。

在这里说一点,缩点时,如果弧(u,v)的v点在一个环中,这个环形成的缩点在新图中的编号是k,那么新图中(u,k)的权值是W(u,v)-in[v],因为ret(即最终的返回值)只在朱刘算法的开始置了一次0,这个权值的变化可以保证,在对一个点加入新的入边时,可以顺便把上一次的旧边的权值在ret中去掉,对于不在环上的点,也是这样

代码如下(模板来自kuangbin)

#include
#include
#include
#include
#define maxn 105
#define maxm 10005
using namespace std;
struct Edge
{
	int u, v;
	double cost;
};
Edge edge[maxm];
int pre[maxn], vis[maxn],id[maxn];
double in[maxn],xy[maxn][2];
inline double cal_dis(int i,int j)
{
	return sqrt(pow(xy[i][0] - xy[j][0], 2) + pow(xy[i][1] - xy[j][1], 2));
}
//root为根的序号,n为点数,m为有效的边的数量(即去除掉自环)
double liuzhu(int root, int n, int m)
{
	int v,tn;
	double ret = 0;
	while (1)
	{
		for (int i = 1; i <= n; i++)
			in[i] = -1;//-1标志该入边不存在
		for(int i=0;i

 

你可能感兴趣的:(生成树)