Pagini recente » Diferente pentru planificare/asociatia-infoarena intre reviziile 17 si 1 | Diferente pentru autumn-warmup-2007/solutii/runda-2 intre reviziile 56 si 50 | Istoria paginii runda/baraj-vianu-seniori-2021 | Diferente pentru autumn-warmup-2007/solutii/runda-1 intre reviziile 30 si 4 | Diferente pentru blog/acm-2013-etapa-nationala intre reviziile 11 si 12
Nu exista diferente intre titluri.
Diferente intre continut:
Această problemă cere pentru un graf cu $N (N<=100)$ noduri să aflăm diferenţa minimă dintre muchia de cost maxim şi cea de cost minim dintr-un arbore de acoperire al grafului.
Sursa
==code(cpp)|
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define x first
#define y second
#define DN 105
using namespace std;
int n,m,pre[DN];
vector<pair<int,pair<int,int> > > mc;
int find(int x) {
if(pre[x]==x) return x;
pre[x]=find(pre[x]);
return pre[x];
}
void unite(int x,int y) {
pre[find(x)]=find(y);
}
int main() {
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
for(;;) {
cin>>n>>m;
if(!n && !m) break;
for(int i=0; i<m; ++i) {
int a,b,c;
cin>>a>>b>>c;
mc.push_back(make_pair(c,make_pair(a,b)));
}
sort(mc.begin(),mc.end());
int rez=(1<<30);
for(int fm=0; fm<mc.size(); ++fm) {
//Alegem muchia care să aibă costul cel mai mic din apm
int nrm=0,mx;
for(int i=1; i<=n; ++i) pre[i]=i;
for(int i=fm; i<mc.size(); ++i) if(find(mc[i].y.x)!=find(mc[i].y.y)) {
unite(mc[i].y.x,mc[i].y.y);
mx=mc[i].x;
++nrm;
}
if(nrm==n-1) rez=min(rez,mx-mc[fm].x);
}
if(rez!=(1<<30)) cout<<rez<<'\n';
else cout<<"-1\n";
mc.clear();
}
}
==
Dimensiunea datelor de intrare ne permite ca pentru fiecare muchie să alegem doar muchii de cost mai mare până când obţinem un arbore de acoperire şi să alegem cea mai bună diferenţă dintre toţi arborii de acoperire obţinuţi.
Nu exista diferente intre securitate.
Topicul de forum nu a fost schimbat.