pat1087 All Roads Lead to Rome

来源:互联网 发布:淘宝童装店铺招牌图片 编辑:程序博客网 时间:2024/06/18 00:01
#include<cstdio>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<string>#include<cstring>#include<cmath>#include<map>#include<stack>#define ll long longusing namespace std;int bg,ed,cnt,total;int num,cost,sumh,minn;int id[205],happy[205],head[205],dis[205],in[205],vis[205],fa[205];queue<int>q;stack<int>st;map<string,int>mp;string rmp[205];struct node{int to,next,w;}edge[40000];int get(string s){if(mp.find(s) == mp.end())mp[s] = ++total;rmp[mp[s]] = s;return mp[s];}void find_path(){while(!st.empty())st.pop();int i = ed;while(i!=-1){st.push(i);i = fa[i];}}void addedge(int a,int b,int w){edge[cnt].to = b;edge[cnt].w = w;edge[cnt].next = head[a];head[a] = cnt++;}void spfa(){while(!q.empty())q.pop();for(int i = 0;i<205;i++)dis[i] = 1e9;memset(in,0,sizeof(in));q.push(bg);dis[bg] = 0;in[bg] = 1;while(!q.empty()){int u = q.front();q.pop();in[u] = 0;for(int i = head[u];i!=-1;i = edge[i].next){int v = edge[i].to;int w = edge[i].w;if(dis[v]>dis[u]+w){dis[v] = dis[u]+w;if(!in[v]){q.push(v);in[v] = 1;}}}}}void dfs(int u,int dep,int sh,int nm,int pre){if(dep>dis[ed])return;fa[u] = pre;vis[u] = 1;if(u == ed&&dep == dis[ed]){if(sh>sumh){sumh = sh;minn = nm;find_path();}else if(sh == sumh&&nm<minn){minn = nm;find_path();}num++;}for(int i = head[u];i!=-1;i = edge[i].next){int v = edge[i].to;int w = edge[i].w;if(vis[v])continue;dfs(v,dep+w,sh+happy[v],nm+1,u);}vis[u] = 0;}int main(){        int n,k,i,j,w;string s,s1;        cin>>n>>k>>s;total = cnt = 0;memset(head,-1,sizeof(head));ed = get("ROM");bg = get(s);happy[bg] = 0;for(i = 1;i<n;i++){cin>>s;scanf("%d",&happy[get(s)]); }for(i = 1;i<=k;i++){cin>>s>>s1>>w;addedge(get(s),get(s1),w);addedge(get(s1),get(s),w);}spfa();memset(vis,0,sizeof(vis));num = 0;sumh = -1;minn = 1000;dfs(bg,0,0,0,-1);printf("%d %d %d %d\n",num,dis[ed],sumh,sumh/minn);while(!st.empty()){if(st.top()!=ed)cout<<rmp[st.top()]<<"->";else cout<<rmp[ed]<<endl;st.pop();}    return 0;}

0 0