-
D - Lost in Translation
- Gym - 101196D
- 给出一个图,从顶点开始(English),寻找 到每个点优先满足路径最短时的最小花费。
- 思路: bfs 逐层搜索。若同层中有指向同一节点但花费不同的边,取最小即可。给搜到的点上标记即可。
-
#include<bits/stdc++.h> using namespace std; # define inf 0x3f3f3f3f # define maxn 101 # define ll long long map<string,int>wa;; int dis[maxn][2],cnt,sum,n,flag; int num,head[maxn],ind,m,cost; int mmp[maxn][maxn]; void bfs() { queue<int>que; que.push(0); dis[0][0]=dis[0][1]=0; while(!que.empty()) { int u=que.front(); que.pop(); for(int i=0; i<=n; i++) { int v=i; if(mmp[u][v]==inf)continue; if(dis[u][0]+1>dis[v][0]&&dis[v][0]!=-1)continue; if(dis[v][0]==-1) { que.push(v); dis[v][0]=dis[u][0]+1; } if(dis[u][0]+1==dis[v][0]) dis[v][1]=min(dis[v][1],mmp[u][v]); } } } int main() { string temp; string s1,s2; s1="English"; wa[s1]=0; cin>>n>>m; memset(mmp,inf,sizeof(mmp)); for(int i=1; i<=n; i++) { dis[i][0]=-1; dis[i][1]=inf; cin>>temp; if(wa[temp]==0) wa[temp]=++num; } for(int i=1; i<=m; i++) { cin>>s1>>s2>>cost; mmp[wa[s1]][wa[s2]]=mmp[wa[s2]][wa[s1]]=min(cost,mmp[wa[s1]][wa[s2]]); } bfs(); for(int i=1; i<=n; i++) { sum+=dis[i][1]; if(dis[i][1]==inf) { cout<<"Impossible"<<endl; return 0; } } cout<<sum<<endl; return 0; }
D - Lost in Translation Gym -BFS分层
猜你喜欢
转载自blog.csdn.net/BePosit/article/details/83239378
今日推荐
周排行