【最小生成树】 ZOJ 1542 Network

来源:互联网 发布:mac迅雷 浏览器打开 编辑:程序博客网 时间:2024/05/01 12:25

各种看不懂题意。。VJ上没显示SPJ 坑爹。。

输出最小生成树中最长的边长和边

#include <cstdio>#include <cstdlib>#include <cstring>#include <climits>#include <cctype>#include <cmath>#include <string>#include <sstream>#include <iostream>#include <algorithm>#include <iomanip>using namespace std;#include <queue>#include <stack>#include <vector>#include <deque>#include <set>#include <map>typedef long long LL;#pragma comment(linker, "/STACK:1024000000,1024000000")#define pi acos(-1.0)#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1typedef pair<int, int> PI;typedef pair<int, PI> PP;#ifdef _WIN32#define LLD "%I64d"#else#define LLD "%lld"#endifint n,m,out;const int maxn= 1111;const int INF = 112121211;int mp[1011][1011],dist[1011],pre[1011];int flag[3000];int prim(){    int i,min_i,j;    int Min;    int dis[3000];    for( i=1 ; i <=n ; i++ )    {        dis[i] = mp[i][1];        pre[i]=1;    }    memset( flag, 0, sizeof(flag));    flag[1] = 1;    for( i=2 ; i <=n ; i++ )    {        Min = INF;        min_i=i;        for( j=2 ; j <=n ; j++ )        {            if(flag[j]==0 && dis[j]<Min)            {                Min=dis[j];                min_i=j;            }        }        if(Min==INF)            break;        out=max(Min,out);        flag[min_i] = 1;        for( j=2 ; j <=n ; j++ )        {            if(flag[j]==0 && dis[j]>mp[min_i][j])            {                dis[j] = mp[j][min_i];                pre[j]=min_i;            }        }    }}int a[15010] ,b[15100] ,c[15010] ;int main(){#ifndef ONLINE_JUDGE    freopen("in.txt", "r", stdin);    freopen("out.txt", "w", stdout);#endif    while(~scanf("%d%d", &n,&m))    {        out=0;        for(int i=0; i<=n; i++)            for(int j=0; j<=n; j++)                mp[i] [j] =INF;        for(int i=0; i<m; i++)        {            scanf("%d%d%d",&a[i] ,&b[i] ,&c[i] );            if(mp[a[i] ][b[i] ]>c[i] )                mp[a[i] ][b[i] ]=mp[b[i] ][a[i] ]=c[i] ;        }        prim();        printf("%d\n%d\n",out,n-1);        for(int i=2;i<=n;i++)            printf("%d %d\n",i,pre[i]);    }    return 0;}


0 0