1001. Battle Over Cities - Hard Version (35)

题目地址:1001. Battle Over Cities - Hard Version (35)

#include <bits/stdc++.h>
using namespace std;
struct Edge
{
    int x,y,w,s;
    Edge(int a,int b,int c,int d):x(a),y(b),w(c),s(d){}
    bool operator < (const Edge &a){
        return s==a.s?w<a.w:s>a.s;
    }
};
vector<Edge> edge;
int n,m;
int find(vector<int> &parents,int x)
{
    return parents[x]==x?x:parents[x]=find(parents,parents[x]);
}
int kruskal(int u)
{
    int p=0,counts=1;
    vector<int> parents(n+1);
    for(int i=1;i<=n;++i){
        parents[i]=i;
    }
    for(auto e:edge){
        if(e.x==u||e.y==u) continue;
        int l1=find(parents,e.x),l2=find(parents,e.y);
        if(l1!=l2){
            parents[l1]=l2;
            if(!e.s) p+=e.w;
            ++counts;
        }
    }
    return counts==n-1?p:0x7fffffff;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;++i){
        int x,y,w,s;
        scanf("%d %d %d %d",&x,&y,&w,&s);
        edge.push_back(Edge(x,y,w,s));
    }
    sort(edge.begin(),edge.end());
    int maxval=-1;
    vector<int> result;
    for(int i=1;i<=n;++i){
        int ans=kruskal(i);
        if(maxval<ans){
            maxval=ans;
            result.clear();
            result.push_back(i);
        }
        else if(ans==maxval){
            result.push_back(i);
        }
    }
    if(maxval==0){
        printf("0\n");
    }
    else{
        int len=result.size();
        for(int i=0;i<len;++i){
            i==len-1?printf("%d\n",result[i]):printf("%d ",result[i]);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值