poj 2485 Highways(最小生成树,prim)

来源:互联网 发布:中国协同软件排名 编辑:程序博客网 时间:2024/04/30 20:31

小记:求最小生成树里最大的边,


思路:在之前求和的基础上,将和改成判断保存最大的那条边即可。


代码:

#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <map>#include <set>#include <vector>#include <stack>#include <queue>#include <algorithm>#include <string>using namespace std;#define mst(a,b) memset(a,b,sizeof(a))#define REP(a,b,c) for(int a = b; a < c; ++a)#define eps 10e-8const int MAX_ = 550;const int N = 100010;const int INF = 0x7fffffff;int n;struct node{    int s, t;};int g[MAX_][MAX_];int d[MAX_];bool vis[MAX_];int m, cnt;int prim(int start){    REP(i, 0, n){        d[i] = INF;        vis[i] = 0;    }    int sum = -1;    d[start] = 0;    REP(i, 0, n){        int mmin = INF, k;        REP(j, 0, n){            if(!vis[j] && d[j] < mmin){                mmin = d[j];                k = j;            }        }        if(mmin == INF)break;        vis[k]  = 1;        //if(mmin)        sum = max(sum,mmin);        REP(j, 0, n){            if(!vis[j]  && g[k][j] != -1 && d[j] > g[k][j]){                d[j] = g[k][j];            }        }    }    return sum;}int main(){int T, ss, tt;char str[10];scanf("%d", &T);while(T-- && scanf("%d", &n)){        mst(g, -1);        REP(i, 0, n)REP(j, 0, n){            scanf("%d", &g[i][j]);        }/*        REP(i, 0, n)REP(j, 0, n){            printf("%d ", g[i][j]);            if(j == n-1)printf("\n");        }*/        int ans = prim(0);        printf("%d\n", ans);}return 0;}


0 0
原创粉丝点击