【最小生成树】 ZOJ 1542 Network
各种看不懂题意。。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; }