题目地址: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;
}