1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; typedef long long ll; const int maxn = 4600; int vis[maxn]; int dis[maxn]; int head[maxn]; int n,m; map<string,int> M; int num = 1; struct Edge{ int v,next,w; }edge[maxn*2];
void init(){ for(int i=1;i<=n+1;i++){ head[i] = -1; } } void addedge(int v,int u,int w){ edge[num].v = v; edge[num].w = w; edge[num].next = head[u]; head[u] = num++; }
int bfs(){ queue<int> Q; Q.push(M["English"]); vis[1]=1;int cnt = 1; while(Q.size()!=0){ int Front = Q.front(); Q.pop(); for(int i = head[Front]; i!=-1; i = edge[i].next){ if(vis[edge[i].v] && vis[edge[i].v]!=vis[Front]+1) continue; // cout<<Front<<" -> "<<edge[i].v<<"cost"<<edge[i].w<<endl; if(vis[edge[i].v]==vis[Front]+1){ dis[edge[i].v] = min(dis[edge[i].v],edge[i].w); } if(vis[edge[i].v] == 0){ vis[edge[i].v] = vis[Front]+1; Q.push(edge[i].v); dis[edge[i].v] = edge[i].w; cnt++;
} } } int sum = 0; for(int i=1;i<=n+1;i++){ sum += dis[i]; } if(cnt != n+1) return -1; else return sum; }
int main(){ scanf("%d%d",&n,&m); init(); string str, lang1, lang2; int charge; M["English"] = 1; for(int i=1;i<=n;i++){ cin>>str; M[str] = i+1; } for(int i=1;i<=m;i++){ cin>>lang1>>lang2; scanf("%d",&charge); addedge(M[lang1],M[lang2],charge); addedge(M[lang2],M[lang1],charge); }
// for(int i=1;i<=n+1;i++){ // for(int j=head[i]; j != -1; j=edge[j].next){ // cout<<i<<" -> "<<edge[j].v<<" cost "<<edge[j].w<<endl; // } // } // cout<<"-----------"<<endl; int ans = bfs(); if(ans == -1) cout<<"Impossible"<<endl; else cout<<ans<<endl; return 0; }
|
近期评论