• Kruskal && Prim模板


    1. Kruskal(并查集模板):

    /*
    	Kruskal:并查集实现,记录两点和距离,按距离升序排序,O (ElogE)
    */
    struct Edge	{
    	int u, v, w;
    	bool operator < (const Edge &r) const {
    		return w < r.w;
    	}
    }edge[E];
    sort (edge+1, edge+1+m);
    if (!uf.same (x, y))	uf.Union (x, y), ans += w;
    

    2. Prim:

    O (n ^ 2):

    /*
    	Prim:Dijkstra思想,邻接矩阵实现,适合稠密图, O (n ^ 2)
    	不连通返回-1,或返回最小生成树长度(MST)
    */
    int Prim(int s)	{
    	memset (vis, false, sizeof (vis));
    	memset (d, INF, sizeof (d));	d[s] = 0;
    	int ret = 0;
    	for (int i=1; i<=n; ++i)	{
    		int mn = INF, u = -1;
    		for (int i=1; i<=n; ++i)	{
    			if (!vis[i] && d[i] < mn)	mn = d[u=i];
    		}
    		if (u == -1)	return -1;
    		vis[u] = true;	ret += d[u];
    		for (int i=1; i<=n; ++i)	{
    			if (!vis[i] && d[i] > w[u][i])	{
    				d[i] = w[u][i];
    			}
    		}
    	}
    	return ret;
    }
    

    O (ElogV):

    /*
    	Prim:Dijkstra思想,优先队列优化,适合稀疏图,O (ElogV)
    	不连通返回-1,或返回最小生成树长度(MST)
    */
    int Prim(int s)	{
    	memset (vis, false, sizeof (vis));
    	memset (d, INF, sizeof (d));
    	priority_queue<Edge> Q;
    	for (int i=head[s]; ~i; i=edge[i].nex)	{
    		int v = edge[i].v, w = edge[i].w;
    		if (d[v] > w)	{
    			d[v] = w;	Q.push (Edge (v, d[v]));
    		}
    	}
    	vis[s] = true;	d[s] = 0;	int ret = 0;
    	while (!Q.empty ())	{
    		int u = Q.top ().v;	Q.pop ();
    		if (vis[u])	continue;
    		vis[u] = true;	ret += d[u];
    		for (int i=head[u]; ~i; i=edge[i].nex)	{
    			int v = edge[i].v, w = edge[i].w;
    			if (!vis[v] && d[v] > w)	{
    				d[v] = w;	Q.push (Edge (v, d[v]));
    			}
    		}
    	}
    	return ret;
    }
    

      

    编译人生,运行世界!
  • 相关阅读:
    集成学习方法
    nlp知识
    kaggle竞赛入门整理
    pandas知识点
    EM算法
    特征工程
    【clustering】之K-means && K-medoids
    sklearn学习笔记
    周总结十二
    《如何高效学习》读书笔记五
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4781736.html
Copyright © 2020-2023  润新知