primアルゴリズムの隣接図と隣接表方式の実現
1714 ワード
primeアルゴリズム:
primeアルゴリズムは、図G(V,E)に集合Sを設定し、アクセスされた頂点を格納し、集合V−Sから集合Sとの最短距離が最も小さい頂点(uと記す)を選択するたびに、集合Sにアクセスして加えることを基本とする最小生成ツリーの問題を解決するために用いられる.その後、頂点uを仲介点とし、uから到達可能なすべての頂点vと集合Sとの最短距離を最適化する.このような動作は、集合Sが全ての頂点を含むまでn回(nは頂点個数)実行される.
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