hdoj 1301 Jungle Roads

来源:互联网 发布:mac如何看电池损耗 编辑:程序博客网 时间:2024/05/17 06:24

很好写的一个prim。

一个小技巧:输入这样的字符主句时最好使用c++中的cin,cin会自动过滤掉空格,而scanf不会,当然些习惯了用scanf或getchar也无所谓,毕竟scanf输入大数据比cin快。本人在很久以前用cin超时用scanf过了一个题之后习惯也是输入用scanf,不过遇到字符就cin。

/*Hdoj: 1301 Jungle Roads*/#include <iostream>#include <cstdio>#include <cstring>#define MaxV 30#define MaxL 10000using namespace std;int map[MaxV][MaxV];int dis[MaxV];bool visited[MaxV];int n;int Prim(){    visited[0] = true;    dis[0] = 0;    for(int i = 1; i < n; i++) {        dis[i] = map[0][i];        visited[i] = false;    }        int low_cost = 0;    for(int i = 1; i < n; i++) {        int tmp = MaxL;        int tmp_index = 0;        for(int j = 0; j < n; j++) {            if(!visited[j] && dis[j] < tmp) {                tmp = dis[j];                tmp_index = j;            }        }        visited[tmp_index] = true;        low_cost += tmp;        for(int k = 0; k < n; k++) {            if(!visited[k] && dis[k] > map[tmp_index][k]) {                dis[k] = map[tmp_index][k];            }        }    }        return low_cost;}int main(){    //freopen("data.in", "rb", stdin);    while(scanf("%d", &n) != EOF && n != 0) {        for(int i = 0; i < n; i++) {            for(int j = 0; j < n; j++) {                map[i][j] = MaxL;            }        }        for(int i = 0; i < n - 1; i++) {            char c;            int k;            cin >> c >> k;            while(k--) {                int m;                cin >> c >> m;                map[i][c-'A'] = map[c-'A'][i] = m;            }        }               printf("%d\n", Prim());    }        return 0;}

原创粉丝点击