Problem Link: https://toph.co/p/road-minister-techboy
এখানে বলা হয়েছে যে ১ হল রুট
১ থেকে আমার সব নোডে যাওয়া লাগবে তাহলে মিনিমাম কত ডিস্ট্যান্স লাগবে?
এক নোড থেকে অন্য টায় যেতে এবং ব্যাক আসতে হলে দুইটা ডিস্ট্যান্স ই যোগ করা লাগবে
INPUT:
2
3
1 2 3
2 3 4
3
1 2 3
1 3 3
OUPUT:
Case 1: 7
Case 2: 9
প্রথম টার জন্য ৩+৪=৭
আর ২য় টার জন্য ১->২=৩,২->১=৩,১->৩=৩ মোট হবে ৩+৩+৩=৯
#include<bits/stdc++.h>
using namespace std;
#define LL long long
vector<LL>graph[10003], cost[10003];
bool visited[10003];
int level[10003];
LL node, temp;
void DFS(LL u, LL sum)
{
visited[u] = true;
if(sum>temp)
{
temp = sum;
node = u;
}
for(int i=0; i<graph[u].size(); i++)
{
LL v = graph[u][i];
if(!visited[v])
{
level[v] = level[u] + 1;
DFS(v, sum+cost[u][i]);
}
}
return;
}
LL DFS2(LL u)
{
visited[u] = true;
if(u==1)
{
return 0;
}
LL sum = 0;
for(int i=0; i<graph[u].size(); i++)
{
LL v = graph[u][i];
if(!visited[v] && level[v]<level[u])
{
sum = sum + cost[u][i] + DFS2(v);
}
}
return sum;
}
int main()
{
int test;
scanf("%d", &test);
for(int i=1; i<=test; i++)
{
for(int i=0; i<=10000; i++)
{
graph[i].clear();
cost[i].clear();
level[i] = 0;
}
LL n, e, u, v, w;
scanf("%lld", &n);
LL ans = 0;
for(int i=1; i<n; i++)
{
scanf("%lld %lld %lld", &u, &v, &w);
graph[u].push_back(v);
graph[v].push_back(u);
cost[u].push_back(w);
cost[v].push_back(w);
ans = ans + 2*w;
}
memset(visited,false,sizeof(visited));
node = 0;
temp = 0;
level[1] = 1;
DFS(1, 0);
memset(visited,false,sizeof(visited));
LL bad = DFS2(node);
printf("Case %d: %lld\n",i,ans - bad);
}
return 0;
}
এখানে বলা হয়েছে যে ১ হল রুট
১ থেকে আমার সব নোডে যাওয়া লাগবে তাহলে মিনিমাম কত ডিস্ট্যান্স লাগবে?
এক নোড থেকে অন্য টায় যেতে এবং ব্যাক আসতে হলে দুইটা ডিস্ট্যান্স ই যোগ করা লাগবে
INPUT:
2
3
1 2 3
2 3 4
3
1 2 3
1 3 3
OUPUT:
Case 1: 7
Case 2: 9
প্রথম টার জন্য ৩+৪=৭
আর ২য় টার জন্য ১->২=৩,২->১=৩,১->৩=৩ মোট হবে ৩+৩+৩=৯
#include<bits/stdc++.h>
using namespace std;
#define LL long long
vector<LL>graph[10003], cost[10003];
bool visited[10003];
int level[10003];
LL node, temp;
void DFS(LL u, LL sum)
{
visited[u] = true;
if(sum>temp)
{
temp = sum;
node = u;
}
for(int i=0; i<graph[u].size(); i++)
{
LL v = graph[u][i];
if(!visited[v])
{
level[v] = level[u] + 1;
DFS(v, sum+cost[u][i]);
}
}
return;
}
LL DFS2(LL u)
{
visited[u] = true;
if(u==1)
{
return 0;
}
LL sum = 0;
for(int i=0; i<graph[u].size(); i++)
{
LL v = graph[u][i];
if(!visited[v] && level[v]<level[u])
{
sum = sum + cost[u][i] + DFS2(v);
}
}
return sum;
}
int main()
{
int test;
scanf("%d", &test);
for(int i=1; i<=test; i++)
{
for(int i=0; i<=10000; i++)
{
graph[i].clear();
cost[i].clear();
level[i] = 0;
}
LL n, e, u, v, w;
scanf("%lld", &n);
LL ans = 0;
for(int i=1; i<n; i++)
{
scanf("%lld %lld %lld", &u, &v, &w);
graph[u].push_back(v);
graph[v].push_back(u);
cost[u].push_back(w);
cost[v].push_back(w);
ans = ans + 2*w;
}
memset(visited,false,sizeof(visited));
node = 0;
temp = 0;
level[1] = 1;
DFS(1, 0);
memset(visited,false,sizeof(visited));
LL bad = DFS2(node);
printf("Case %d: %lld\n",i,ans - bad);
}
return 0;
}
কোন মন্তব্য নেই:
একটি মন্তব্য পোস্ট করুন