uva 10600 次小生成树

来源:互联网 发布:我的世界ipad枪械js 编辑:程序博客网 时间:2024/06/13 10:13
#include<cstdio>#include<cstring>#include<algorithm>#define INF 0x3f3f3f3fusing namespace std;int G[160][160],d[160][160],pre[160],dis[160],vis[160],use[160][160];int res1,res2,n,m;void prime(){memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){dis[i]=G[1][i];pre[i]=1;}res1=0;vis[1]=1;for(int i=1;i<n;i++){int p=-1,tm=INF;for(int j=1;j<=n;j++){if(!vis[j] && tm>dis[j]){tm=dis[j];p=j;}}if(p!=-1){use[pre[p]][p]=use[p][pre[p]]=0;for(int j=1;j<=n;j++){if(vis[j]){d[j][p]=max(d[j][pre[p]],G[pre[p]][p]);}}vis[p]=1;res1+=tm;for(int j=1;j<=n;j++){if(!vis[j] && dis[j] > G[p][j]){dis[j]=G[p][j];pre[j]=p;}}}}}void solve(){int tm=INF;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(use[i][j])tm=min(tm,G[i][j]-d[i][j]);}res2=res1+tm;}int main(){int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)G[i][j]=INF,use[i][j]=0;for(int i=0;i<m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);G[a][b]=G[b][a]=c;use[a][b]=use[b][a]=1;}prime();solve();printf("%d %d\n",res1,res2);}}