prim算法初体验

来源:互联网 发布:郭天祥十天学会单片机4 编辑:程序博客网 时间:2024/06/11 05:40

题目链接

#include <vector>#include <iostream>#include <algorithm>#include <string.h>#include <stdio.h>using namespace std;const int size = 501;/////////////////////////////primint map[size][size];int v,e;int dis[size];bool visit[size];int prim(){    memset(visit,false, sizeof(visit));    int sum = 0;    // 首先任意选一个点,计算到另一个集合的距离    for (int i = 2; i <= v; ++i) {        dis[i] = map[1][i];    }    visit[1] = true;    // 循环找n-1次    for (int i = 0; i < v-1; ++i) {        int m = 0x7fffffff, u = -1;        for (int j = 2; j <= v; ++j) {            if (!visit[j]&&dis[j]<m){                m = dis[j];                u = j;            }        }        sum += m;        visit[u] = true;        // 找到下一个加入集合的点        //然后更新dis的值        for (int k = 2; k <=v ; ++k) {            if (!visit[k]&&dis[k]>map[u][k]){                dis[k] = map[u][k];            }        }    }    return sum;}int main(){    int testcase;    scanf("%d",&testcase);    while (testcase--){        memset(map,0x7f, sizeof(map));        scanf("%d %d",&v,&e);        int a,b,c;        for (int i = 0; i < e; ++i) {            scanf("%d %d %d",&a,&b,&c);            map[a][b] = c;            map[b][a] = c;        }        int nodecost = 0x7fffffff;        for (int i = 0; i < v; ++i) {            int temp;            scanf("%d",&temp);            nodecost = min(nodecost,temp);        }        cout<<nodecost+prim()<<endl;    }}
原创粉丝点击