Friday, May 27, 2011

11710 - Expensive subway


#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

struct Edge
{
    int u,v,cost;
};

map<string,int>ST;
vector<Edge>E;
vector<int>p;

int FindID(string);
bool comp(Edge,Edge);
int parent (int i);
int Kruskal(int,int);

int main()
{   
    int t,i,k,S,C,N,M,A,z;
    string x,y;
    //freopen ("in.txt","r",stdin);

    while((cin>>S>>C)&&(S|C))
    {
        E = vector<Edge> (C);

        for (i = 0;i < S;i++)
        {
            cin>>x;
            ST[x]=i;
        }

        for(i=0;i<C;i++)
        {
            cin>>x>>y>>z;

            E[i].u = ST[x];
            E[i].v = ST[y];
            E[i].cost = z;
        }
   
        cin>>x;
       
        z = Kruskal(S,C);

        if(z<0)
            cout<<"Impossible\n";
        else
            cout<<z<<endl;

        E.clear ();
        ST.clear();
        p.clear();
    }
    cin>>t;
    return 0;
}

int parent (int i)
{
    if (p[i] == i)
        return p[i];
    return parent(p[i]);
}

bool comp(Edge e1,Edge e2)
{
    if(e1.cost<e2.cost)
        return true;
    return false;
}

int Kruskal(int s,int c)
{
    int i,tc = 0,u,v,n = s - 1;

    sort(E.begin(),E.end(),comp);
    p = vector<int>(s + 1);
    for (i = 0;i <= s;i++)
            p[i] = i;

    for (i = 0;i < c && n;i++)
    {
        u = parent(E[i].u);
        v = parent(E[i].v);
        
        if (u != v)
        {
            n--;
            p[u] = v;
            tc += E[i].cost;
        }
    }
    if(n)return -1;
    return tc;
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.