使用STL在C ++中实现Kruskal算法

时间:2015-04-11 16:31:50

标签: vector stl kruskals-algorithm

我正在尝试用C ++实现Kruskal算法。我按照youtube视频中的说明进行操作,其中使用了向量。虽然代码显示在视频中准确运行,但相同的代码甚至无法在我的PC中编译。我无法弄清楚这个问题。 这是代码:     #包括     #包括     使用namespace std;

struct Edge{
char vertex1;
char vertex2;
int weight;
Edge(char v1, char v2, int w):vertex1(v1),vertex2(v2),weight(w){}
};

struct Graph
{
vector<char> vertices;
vector<Edge> edges;
};

unordered_map<char,char> PARENT;
unordered_map<char, int> RANK;

char Find(char vertex){
if(PARENT[vertex]==vertex)
    return PARENT[vertex];
else
    return Find(PARENT[vertex]);
}

void Union(char root1, char root2)
{
if(RANK[root1]>RANK[root2]){
    PARENT[root2]=root1;
}
else if(RANK[root2]>RANK[root1]){
    PARENT[root1]=root2;
}
else{
    PARENT[root1]=root2;
    RANK[root2]++;
}
}

void MakeSet(char vertex){
PARENT[vertex] = vertex;
RANK[vertex] = 0;
}

void Kruskal(Graph& g)
{
vector<Edge> A;
for(auto c: g.vertices){
    Makeset(c);
}
sort(g.edges.begin(),g.edges.end(), [](Edge x, Edge y)
{return x.weight<y.weight;});

for(Edge e: g.edges){
    char root1 = Find(e.vertex1);
    char root2 = Find(e.vertex2);
    if(root1!=root2){
        A.push_back(e);
        Union(root1, roo2);
    }
}

for(Edge e: A){
    cout << e.vertex1 << "----" << e.vertex2 << " " e.weight << endl;
}
}

int main()
{
char t[]={'a','b','c','d','e','f'};

Graph g;
g.vertices = vector<char>(t,t+sizeof(t)/sizeof(t[0]));

char sv,ev;
int wt;
while(!EOF){
    cin >> sv >> ev >> wt;
    g.edges.push_back(Edge(sv,ev,wt));
}

Kruskal(g);

return 0;
}

1 个答案:

答案 0 :(得分:0)

您需要在代码中包含一些头文件:

  1. unordered_map使用unordered_map STL。而且,您只能在C ++ 11和C ++ 14中使用它。
  2. vector使用向量STL。
  3. algorithm使用内置的sort()函数。
  4. 还有一些错误:

    1. 该功能的名称为MakeSet(),您可以使用Makeset()
    2. 进行调用
    3. 您在roo2循环中使用root2代替for(Edge e: g.edges){}
    4. cout循环中的for(Edge e: A){}语句在语法上不正确。