const int INF = 0x3f3f3f3f;
struct Edge
{
int vertex, weight;
};
class Graph
{
private:
int n;
bool * visited;
vector<Edge> * edges;
public:
int * dist;
Graph (int input_n)
{
n = input_n;
edges = new vector<Edge>[n];
dist = new int[n];
visited = new bool[n];
memset(visited, false, n * sizeof(bool));
memset(dist, 0x3f, n * sizeof(int));
}
~Graph()
{
delete[] dist;
delete[] visited;
delete[] edges;
}
void insert(int x, int y, int weight)
{
edges[x].push_back(Edge{y, weight});
edges[y].push_back(Edge{x, weight});
}
int prim(int v)
{
int total_weight = 0;
dist[v] = 0;
for (int i = 0; i<n; i++)
{
int min_dist = INF, min_vertex;
for (int j = 0; j<n; j++)
{
if (!visited[j] && dist[j] < min_dist)
{
min_dist = dist[j];
min_vertex = j;
}
}
total_weight += min_dist;
visited[min_vertex] = 1;
for (Edge &j : edges[min_vertex])
{
if (!visited[j.vertex] && j.weight < dist[j.vertex])
{
dist[j.vertex] = j.weight;
}
}
}
return total_weight;
}
};
Prim 模板
在枚举 edges[min_vertex] 的时候用了 C++ 11 的新语法
需要将 j 替换为 edges[ min_vertex ][ j ]