您的位置:首页 > 其它

【最小生成树】 ZOJ 1542 Network

2014-10-02 18:56 316 查看
各种看不懂题意。。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|1
typedef pair<int, int> PI;
typedef pair<int, PI> PP;
#ifdef _WIN32
#define LLD "%I64d"
#else
#define LLD "%lld"
#endif
int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  prim zoj 水题