#include<bits/stdc++.h>
#define mx 100009
using namespace std;
map<string,int>mp;
bool visited[79809];
vector<string>v;
vector<int>g[79809];
int ct;
void dfs(int n)
{
visited[n]=1;
for(int i=0;i<g[n].size();i++)
{
int m=g[n][i];
if(!visited[m])
{
ct++;
dfs(m);
}
}
}
struct edge
{
int u,v,w;
bool operator < (const edge& p) const
{
return w<p.w;
}
};
int pr[mx];
vector<edge>e;
int fnd(int r)
{
return (pr[r]==r)?r:fnd(pr[r]);
}
int mst(int n)
{
sort(e.begin(),e.end());
for(int i=1;i<=n;i++)
{
pr[i]=i;
}
int cnt=0,s=0;
for(int i=0;i<(int)e.size();i++)
{
int u=fnd(e[i].u);
int v=fnd(e[i].v);
if(u!=v)
{
pr[u]=v;
cnt++;
s+=e[i].w;
if(cnt==n-1)
break;
}
}
return s;
}
int main()
{
int i,j,k,l,m,n;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
else
{
mp.clear();
e.clear();
v.clear();
string s;
for(i=0;i<79809;i++)
{
g[i].clear();
}
memset(visited,0,sizeof(visited));
for(i=0;i<n;i++)
{
cin>>s;
v.push_back(s);
}
int num=1;
for(i=0;i<m;i++)
{
string from,to;
int u,v,w;
cin>>from>>to>>w;
if(mp[from]!=0)
{
u=mp[from];
}
if(mp[to]!=0)
{
v=mp[to];
}
if(!mp[from])
{
u=num;
mp[from]=num;
num++;
}
if(!mp[to])
{
v=num;
mp[to]=num;
num++;
}
edge get;
get.u=u;
get.v=v;
get.w=w;
e.push_back(get);
swap(u,v);
get.u=u;
get.v=v;
get.w=w;
e.push_back(get);
g[u].push_back(v);
g[v].push_back(u);
}
string st;
cin>>st;
int start=mp[st];
ct=1;
dfs(start);
if(ct!=n)
{
cout<<"Impossible"<<endl;
continue;
}
cout<<mst(n)<<endl;
}
}
return 0;
}
#define mx 100009
using namespace std;
map<string,int>mp;
bool visited[79809];
vector<string>v;
vector<int>g[79809];
int ct;
void dfs(int n)
{
visited[n]=1;
for(int i=0;i<g[n].size();i++)
{
int m=g[n][i];
if(!visited[m])
{
ct++;
dfs(m);
}
}
}
struct edge
{
int u,v,w;
bool operator < (const edge& p) const
{
return w<p.w;
}
};
int pr[mx];
vector<edge>e;
int fnd(int r)
{
return (pr[r]==r)?r:fnd(pr[r]);
}
int mst(int n)
{
sort(e.begin(),e.end());
for(int i=1;i<=n;i++)
{
pr[i]=i;
}
int cnt=0,s=0;
for(int i=0;i<(int)e.size();i++)
{
int u=fnd(e[i].u);
int v=fnd(e[i].v);
if(u!=v)
{
pr[u]=v;
cnt++;
s+=e[i].w;
if(cnt==n-1)
break;
}
}
return s;
}
int main()
{
int i,j,k,l,m,n;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
else
{
mp.clear();
e.clear();
v.clear();
string s;
for(i=0;i<79809;i++)
{
g[i].clear();
}
memset(visited,0,sizeof(visited));
for(i=0;i<n;i++)
{
cin>>s;
v.push_back(s);
}
int num=1;
for(i=0;i<m;i++)
{
string from,to;
int u,v,w;
cin>>from>>to>>w;
if(mp[from]!=0)
{
u=mp[from];
}
if(mp[to]!=0)
{
v=mp[to];
}
if(!mp[from])
{
u=num;
mp[from]=num;
num++;
}
if(!mp[to])
{
v=num;
mp[to]=num;
num++;
}
edge get;
get.u=u;
get.v=v;
get.w=w;
e.push_back(get);
swap(u,v);
get.u=u;
get.v=v;
get.w=w;
e.push_back(get);
g[u].push_back(v);
g[v].push_back(u);
}
string st;
cin>>st;
int start=mp[st];
ct=1;
dfs(start);
if(ct!=n)
{
cout<<"Impossible"<<endl;
continue;
}
cout<<mst(n)<<endl;
}
}
return 0;
}
No comments:
Post a Comment