1379 - Toll Management solution


Problem Link: here

Description:
একটি ডিরেক্টেড ওয়েটেড গ্রাফ দেয়া আছে। s হচ্ছে সোর্স , t = ডেসটিনেশন, cost limit = p.
s থেকে t তে এমন একটা ভ্যালিড পথে যেতে হবে যেখানে একটা edge এর ওয়েট সর্বোচ্চ হবে। ভ্যালিড পথ হতে হলে 
s থেকে  t তে পাথ থাকতে হবে এবং পাথের টোটাল cost ,p এর সমান বা ছোট হতে হবে।

solution: here



#include<bits/stdc++.h>
using namespace std;
#define MX 10005
#define pii pair<int,int>
#define pip pair<int,pii>
vector<pii> adj[MX];
vector<pii> adj2[MX];
vector <pip> ed;
int dis[MX];
int dis2[MX];
int limit;
void Djakstra(int s)
{
    priority_queue <pii> PQ;
    PQ.push(pii(0,s));
    while(!PQ.empty())
    {
        int u = PQ.top().second;
        PQ.pop();
        for (int i=0; i<adj[u].size(); i++)
        {
            int v = adj[u][i].first;
            int w = adj[u][i].second;
            if (dis[u]+w < dis[v])
            {
                dis[v] = dis[u]+w;
                PQ.push(pii(-dis[v],v));
            }
        }
    }
}


void Djakstra2(int s)
{
    priority_queue <pii> PQ;
    PQ.push(pii(0,s));
    while(!PQ.empty())
    {
        int u = PQ.top().second;
        PQ.pop();
        for (int i=0; i<adj2[u].size(); i++)
        {
            int v = adj2[u][i].first;
            int w = adj2[u][i].second;
            if (dis2[u]+w < dis2[v])
            {
                dis2[v] = dis2[u]+w;
                PQ.push(pii(-dis2[v],v));
            }
        }
    }
}

int main()
{
    int tc;
    scanf("%d",&tc);
    int id=1;
    while(tc--)
    {
        int node,edge,src,dsn;
        scanf("%d%d%d%d%d",&node,&edge,&src,&dsn,&limit);
        int i;
        for (i=0; i<edge; i++)
        {
            int u,v,cost;
            scanf("%d%d%d",&u,&v,&cost);
            adj[u].push_back(pii(v,cost));
            adj2[v].push_back(pii(u,cost));
            ed.push_back(pip(cost,pii(u,v)));
        }

        for (i=0; i<=node; i++)
        {
            dis[i] = 100000000;
            dis2[i] = 100000000;
        }
        dis[src]=0;
        Djakstra(src);
        dis2[dsn]=0;
        Djakstra2(dsn);
        //cout<<"dis of des "<<dis[dsn]<<endl;
        int mx = -1;
        for (i=0; i<edge; i++)
        {
            int cost = ed[i].first;
            int u = ed[i].second.first;
            int v = ed[i].second.second;
            if (cost > mx)
            {
                int cost2 = dis[u]+cost+dis2[v];
                if (cost2 <= limit) mx = cost;
            }
        }
        printf("Case %d: %d\n",id++,mx);
        for (i=0; i<=node; i++)
        {
            adj[i].clear();
            adj2[i].clear();
        }
        ed.clear();
    }
    return 0;
}

No comments

Theme images by enot-poloskun. Powered by Blogger.