1863 畅通工程-并查集最小生成树

题目链接

 

问题描述:

  1863 畅通工程-并查集最小生成树_第1张图片

 

 

简单的最小生成树的题,将路径按cost从小到大排序,利用克鲁斯塔尔求最小生成树算法就行。

代码:

  

 1 #include
 2 #include
 3 #include
 4 
 5 using namespace std;
 6 struct  Road
 7 {
 8     int beg;
 9     int end;
10     int cost;
11     Road(int beg, int end, int cost)
12     {
13         this->beg = beg;
14         this->end = end;
15         this->cost = cost;
16     }
17     bool operator <(const Road& b) const 
18     //必须要带const,使用STL,或者自己写compare函数
19     //优先级大的在队列的前面,所以重载的时候需要注意需要的形式
20     {
21         return (cost > b.cost);
22     }
23     
24 };
25 
26 int father[101];
27 int getfather(int a) //路径压缩
28 {
29     if(father[a] != a)
30     {
31             father[a] = getfather(father[a]);
32         return father[a];
33     }
34     else
35         return father[a];
36 }
37 
38 priority_queue q;
39 //并查集
40 
41 int num;
42 int vnum;
43 
44 int main()
45 {
46     cin>>num>>vnum;
47     int scost = 0;
48     int  ok = 0;
49     Road a = {0,0,0};
50     while(num)
51     {
52         scost = 0;
53         for(int i=0; i<=vnum; i++)
54         {
55             father[i] = i;
56         }
57         for(int i=0; i)
58         {
59             cin>>a.beg>>a.end>>a.cost;
60             q.push(a);
61         }
62         while(!q.empty())
63         {
64             a = q.top();
65             q.pop();
66             if(getfather(a.beg) != getfather(a.end))
67             {
68                 father[a.end] = father[a.beg];
69                 scost += a.cost;
70                 ok++;
71             }
72         }
73         if(ok == vnum-1)
74             cout<endl;
75         else
76             cout<<"?"<<endl;
77         ok = 0;
78         cin>>num>>vnum;
79 
80     }
81     return 0;
82 }

 

你可能感兴趣的:(1863 畅通工程-并查集最小生成树)