বৃহস্পতিবার, ২৩ মে, ২০১৯

Graph Minimum distance

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;
}

কোন মন্তব্য নেই:

একটি মন্তব্য পোস্ট করুন

Factorization with prime Sieve

vector <int> prime; char sieve[1000009]; int N=1000009; void primeSieve ( ) { sieve[0] = sieve[1] = 1; prime.push_back(2); ...