LightOJ1029->Prime
题意:
求一棵最大生成树和最小生成树。
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std ;
#define INF 0x3f3f3f3f
#define MAX 110
int n ;
bool visit[MAX] ;
int cost[MAX][MAX] ;
int cost2[MAX][MAX] ;
int lowc[MAX] ;
int dist[MAX] ;
int prime()
{
int ans = 0;
int t = n ;
memset(visit , false , sizeof(visit)) ;
visit[0] = true ;
while(t --)
{
int minc = INF ;
int p = -1 ;
for(int j = 1 ; j <= n ; j ++)
{
if(!visit[j] && minc > cost[0][j])
{
minc = cost[0][j] ;
p = j ;
}
}
if(minc == INF)
{
break ;
}
ans += minc ;
visit[p] = true ;
for(int j = 1 ; j <= n ; j ++)
{
if(!visit[j] && cost[p][j] < cost[0][j])
{
cost[0][j] = cost[p][j] ;
}
}
}
return ans ;
}
int prime2()
{
int ans = 0 ;
int t = n ;
memset(visit , false , sizeof(visit)) ;
visit[0] = true ;
while(t --)
{
int minc = 0 ;
int p = -1 ;
for(int j = 1 ; j <= n ; j ++)
{
if(!visit[j] &&cost2[0][j]!=0&& minc < cost2[0][j])
{
minc = cost2[0][j] ;
p = j ;
}
}
if(minc == 0)
{
break ;
}
ans += minc ;
visit[p] = true ;
for(int j = 1 ; j <= n ; j ++)
{
if(!visit[j] && cost2[p][j]!=0 &&cost2[p][j] > cost2[0][j])
{
cost2[0][j] = cost2[p][j] ;
}
}
}
return ans ;
}
int main()
{
int T , u , v, w ;
scanf("%d" , &T) ;
for(int cas = 1 ; cas <= T ; cas ++)
{
scanf("%d" , &n) ;
memset(cost , INF , sizeof(cost)) ;
memset(cost2 , -1 , sizeof(cost2)) ;
while(scanf("%d%d%d",&u,&v,&w),u+v+w)
{
if(w < cost[u][v])
cost[u][v] = cost[v][u] = w ;
if(w > cost2[u][v])
cost2[u][v] = cost2[v][u] = w ;
}
int a = prime() ;
int b = prime2() ;
if((a + b)%2 != 0)
printf("Case %d: %d/%d\n" , cas , a+b , 2) ;
else
printf("Case %d: %d\n" , cas , (a+b)/2);
}
return 0 ;
}