여기에서 우리는 한 가지 문제를 볼 것입니다. 이 문제에서 트리의 한 모서리와 합 S가 주어집니다. 작업은 가중치 측면에서 가장 긴 경로가 최소화되도록 다른 모든 가중치에 가중치를 할당하는 것입니다. 할당된 가중치의 합은 'S'와 같습니다.
접근 방식은 간단합니다. 경로에 최대 두 개의 리프 노드가 있을 수 있는 트리의 속성입니다. 이는 솔루션을 얻는 데 사용됩니다. 따라서 리프 노드를 연결하는 가장자리에만 가중치를 할당하고 다른 가장자리를 0으로 할당하면 리프 노드에 연결하는 모든 가장자리는 다음과 같이 할당됩니다.
경로는 최대 두 개의 리프 노드를 포함할 수 있으므로 가장 긴 경로는
예시
#include<iostream> #include<vector> using namespace std; void insertEdge(int u, int v, vector<int> adj[]) { adj[u].push_back(v); adj[v].push_back(u); } long double pathLength(vector<int> adj[], int sum, int n) { int count = 0; for (int i = 1; i <= n; i++) { if (adj[i].size() == 1) count++; } long double ans = 2.0 * (long double)(sum / (long double)(count)); return ans; } int main() { int n = 6; vector<int> adj[n + 1]; insertEdge(1, 2, adj); insertEdge(2, 3, adj); insertEdge(2, 4, adj); insertEdge(4, 5, adj); insertEdge(4, 6, adj); int sum = 1; cout << pathLength(adj, sum, n); }
출력
0.5