Это в основном токийский региональный вопрос ICPC — Slim Span (UVA-1395)
Ссылка на вопрос-https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid = 8&страница = show_problem&проблема = 4141
Вопрос гласит, что самое тонкое дерево — это дерево с минимальной разницей между его самым коротким и самым длинным краем, и само дерево не обязательно должно быть минимальным остовным деревом, оно просто должно быть остовным деревом.
#include <iostream>
#include <vector>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <utility>
#include <algorithm>
#include <set>
using namespace std;
const int MAX = 110;
struct ii{
int first,second,third;
ii(int x, int y, int z){
first=x;//destination node
second=y;//weight of the edge
third=z;//slimness
}
bool operator<(const ii& rhs) const
{
return third > rhs.third;//slimmest edge first
}
};
vector <ii> adj[MAX];//adjacency list
int prim(int source, int n){
int maximum=-1, minimum=987654321;//maximum and minimum edge lengths
set<int> notvisited;//nodes not yet visited by prim
priority_queue< ii, vector< ii > > pq;
for(int i=1;i<=n; ++i){
notvisited.insert(i);
}
pq.push(ii(source, 0,0));
set<int>::iterator iterator1;
while(!pq.empty() && !notvisited.empty()){
ii temp=pq.top();
pq.pop();
int s=temp.first;//target
int w=temp.second;//weight of edge
//if visited->continue
if((iterator1=notvisited.find(s))==notvisited.end())continue;
notvisited.erase(s);
if(w!=0){
maximum=max(maximum,w);
minimum=min(minimum,w);
}
for(int i=0; i<adj[source].size(); ++i){
int target=adj[source][i].first;
int targetw=adj[source][i].second;
int slimness=targetw-w;
if((iterator1=notvisited.find(target))!=notvisited.end()){
pq.push(ii(target,targetw,max(slimness, 0-slimness)));
}
}}
return maximum-minimum;
}
Моя идея состояла в том, чтобы отсортировать края, используя тонкость вместо веса. Он не работает, потому что с самого начала всегда помечает самый короткий край как посещенный.
Как мне исправить мою программу, чтобы решить эту проблему?
Образец ввода-
4 6 // количество узлов, количество ребер
1 2 10 // вес источника назначения
1 3 100
1 4 90
2 3 20
2 4 80
3 4 40
Выход-
20
Задача ещё не решена.
Других решений пока нет …