前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POj 1797 Heavy Transportation

POj 1797 Heavy Transportation

作者头像
用户1624346
发布2018-04-11 17:16:08
6340
发布2018-04-11 17:16:08
举报
文章被收录于专栏:calmound

题意:求从1-n所能承受的最大重量是多少,其最大重量就是1-n通路的最小边

分析:求最大生成树的最小边,排序的时候按照权值从大到小派,然后生成树,知道找到1-n的通路就可以了

代码语言:javascript
复制
#include<stdio.h>
#include<algorithm>
using namespace std;

const int MAXN=1005;
const int INF=0x7fffffff;

int father[MAXN];
int rank[MAXN];
int ans,n,m;

struct Edge
{
    int u,v;
    int w;
}edge[100000];//这里数组开小了re,题目并没有说m的大小,仅仅说了n的大小

bool cmp(Edge a,Edge b)
{
    return a.w>b.w;//这里是关键不是从小到大了
}

void Make_set(int n)
{
    for (int i=0;i<=n;i++)
    {
        father[i]=i;
        rank[i]=0;
    }
}

int Find_set(int x)
{
    int r=x;
    while(r!=father[r])
    {
        r=father[r];
    }
    if(r!=x) father[x]=r;
    return r;
}

void Union(int x,int y)
{
    if(x==y) return ;
    if(rank[x]>rank[y])
    {
        father[y]=x;
    }
    else
    {
        if(rank[x]==rank[y])
        {
            rank[y]++;
        }
        father[x]=y;
    }
}

void Kruskal(int cas)
{
    sort(edge,edge+cas,cmp);
    ans=INF;
    for (int i=0;i<cas;i++)
    {
        int x=Find_set(edge[i].u);
        int y=Find_set(edge[i].v);
        if(x!=y) Union(x,y);
        if(ans>edge[i].w)  ans=edge[i].w;
        if(Find_set(1)==Find_set(n)) break;
    }
}

int main()
{
    int T,i;
    int tes=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for (i=0;i<m;i++)
        {
            scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
        }
        Make_set(n);
        Kruskal(m);
        printf("Scenario #%d:\n",tes++);
        printf("%d\n\n",ans);//后面还有一个空白空格,没看见
    }
    return 0;
    
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-07-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档