primアルゴリズムの隣接図と隣接表方式の実現

1714 ワード

primeアルゴリズム:
primeアルゴリズムは、図G(V,E)に集合Sを設定し、アクセスされた頂点を格納し、集合V−Sから集合Sとの最短距離が最も小さい頂点(uと記す)を選択するたびに、集合Sにアクセスして加えることを基本とする最小生成ツリーの問題を解決するために用いられる.その後、頂点uを仲介点とし、uから到達可能なすべての頂点vと集合Sとの最短距離を最適化する.このような動作は、集合Sが全ての頂点を含むまでn回(nは頂点個数)実行される.
#include 
#include
#include
using namespace std;
const int MAXV = 1000;//     
const int INF = 1000000000;

//     
int n, G[MAXV][MAXV];
int d[MAXV];//     s     
bool vis[MAXV] = { false };

int prime()//  0      ,              
{
	fill(d, d + MAXV, INF);
	d[0] = 0;
	int ans = 0;//            
	for (int i = 0; i < n; i++)//  n 
	{
		int u = -1, MIN = INF;
		for (int j = 0; j < n; j++)
		{
			if (vis[j] == false && d[j] < MIN)
			{
				u = j;
				MIN = d[j];
			}
		}
		if (u == -1) return -1;//            ,n     n     ,        
		vis[u] = true;
		ans += d[u];//    s             
		for (int v = 0; v < n; v++)
		{
			if (vis[v] == false && G[u][v]!=INF)
			{
				if (G[u][v] < d[v]) {
					d[v] = G[u][v];
					
				}
			}
		}
	}
	return ans;
}


//    
struct Node {
	int v, dis;
};
vectorAdj[MAXV];

int prime()//  0      ,              
{
	fill(d, d + MAXV, INF);
	d[0] = 0;
	int ans = 0;//            
	for (int i = 0; i < n; i++)//  n 
	{
		int u = -1, MIN = INF;
		for (int j = 0; j < n; j++)
		{
			if (vis[j] == false && d[j] < MIN)
			{
				u = j;
				MIN = d[j];
			}
		}
		if (u == -1) return -1;//            ,n     n     ,        
		vis[u] = true;
		ans += d[u];//    s             
		for (int j= 0; j< Adj[u].size(); j++)
		{
			if (vis[j] == false &&Adj[u][j].dis