免费网站设计培训班,做网页和做网站,wordpress插件密钥服务器,东莞企业网站推广怎么做正题 题目大意
一张无向图#xff0c;求剩下一些边使图联通且wG∗max{gVi}wS∗max{sVi}wG*max\{g_{V_i}\}wS*max\{s_{V_i}\}wG∗max{gVi}wS∗max{sVi}最小 VVV表示选的边集 解题思路
我们可以枚举max{si}max\{s_i\}max{si}的值#xff0c;然后用ggg跑最小生成树。…正题 题目大意
一张无向图求剩下一些边使图联通且wG∗max{gVi}wS∗max{sVi}wG*max\{g_{V_i}\}wS*max\{s_{V_i}\}wG∗max{gVi}wS∗max{sVi}最小 VVV表示选的边集 解题思路
我们可以枚举max{si}max\{s_i\}max{si}的值然后用ggg跑最小生成树。时间复杂度O(m2)O(m^2)O(m2)就可以成功TLETLETLE
这时就需要用到最小生成树的性质。对于新的一个max{si}max\{s_i\}max{si}你只能加入一条新的边直接用这个加进去跑一边最小生成树就好了。 codecodecode
#includecstdio
#includealgorithm
#define Inf 1e18
#define N 500
#define M 50010
#define ll long long
using namespace std;
struct node{ll x,y,g,s;
}a[M];
ll n,m,wS,wG,ans,tot;
ll fa[N],s[M],p[N];
bool cmp(node x,node y)
{return x.gy.g;}
ll find(ll x)
{return fa[x]x?x:fa[x]find(fa[x]);}
void unionn(ll x,ll y)
{ll Fafind(x),Fbfind(y);if(FaFb) fa[Fb]Fa;else fa[Fa]Fb;
}
int main()
{scanf(%lld%lld%lld%lld,n,m,wG,wS);for(ll i1;im;i){scanf(%lld%lld%lld%lld,a[i].x,a[i].y,a[i].g,a[i].s);}ansInf;sort(a1,a1m,cmp);for(ll i1;im;i){if(a[i].xa[i].y)continue;ll j,k0,cnt0;for(j1;jn;j)fa[j]j;for(jtot;j1;j--)if(a[p[j]].sa[i].s) p[j1]p[j];else break;p[j1]i;tot;for(j1;jtot;j){if(find(a[p[j]].x)!find(a[p[j]].y)){unionn(a[p[j]].x,a[p[j]].y);kmax(k,a[p[j]].s);p[cnt]p[j];}if(cntn-1) break;}if(cntn-1) ansmin(ans,k*wSa[i].g*wG);totcnt;}if(ansInf) printf(-1);else printf(%lld,ans);
}