#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.