Networking POJ - 1287 (最小生成树 裸题)

Networking POJ - 1287

存在许多点和点与点之间的路径,路径长度不一,点到点之间可能存在多条路径。挑选部分路径使得所有点连通且总路径长度最小。

Input

多样例输入。每个样例都保证有解。
每个样例的第一行有两个整数,P(点的个数),R(点与点之间的路径总数)。
接下来的R行输入路径,每行含3个整数,前两个数表示连接的两个点,第三个数表示路径长度。
当P为0时输入结束。样例与样例之间存在空行
P最大为50,路径长度最大为100,路径数没有限制。
i和j之间的路径可以表示为 i j 或 j i

Output

对于每个样例,输出一个数表示设计出的路径总长度

Examples

Sample Input
1 0

2 3
1 2 37
2 1 17
1 2 68

3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32

5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12

0
Sample Output
0
17
16
26

Hint

取一下最小边, 然后直接上Prim就行了




题意:

题解:

经验小结:


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef  long long LL;
const int inf = 1<<30;
const LL maxn = 55;

int V, E, w[maxn][maxn];
int d[maxn];
bool used[maxn];
typedef pair<int, int> P;
int Prim(){
    priority_queue<P, vector<P>, greater<P> > q;
    ms(used, 0);
    fill(d, d+maxn, inf);
    q.push(P(d[1]=0, 1));
    int ret = 0;

    while(!q.empty()){
        P cur = q.top();
        q.pop();
        int u = cur.second;
        if(used[u]) continue;
        used[u] = true;
        ret += d[u];
        for(int v = 1; v <= V; v++)
            if(w[u][v] < d[v]){
                d[v] = w[u][v];
                q.push(P(d[v], v));
            }
    }
    return ret;
}
int main()
{
    while(cin >> V && V!=0){
        cin >> E;
        fill(w[0], w[0]+maxn*maxn, inf);
        int a, b, c;
        for(int i = 1; i <= E; i++){
            cin >> a >> b >> c;
            w[a][b] = w[b][a] = min(c, w[a][b]);
        }
        cout << Prim() << endl;
    }

	return 0;
}

你可能感兴趣的:(图论)