Violent Dfs.
#include <cstdio>#include<cstring>#include<cmath>#include<vector>#include<map>#include<stack>#include<queue>#include<string>#include<iostream>#include<algorithm>using namespacestd;Const intmaxn= ++Ten;intn,m;stringSt;map<string,int>M1;map<int,string>m2;intsz;intH[MAXN];structedge{intU,v,c;} E[MAXN*MAXN];intTot;vector<int>G[MAXN];intdes;intans_cost=0x7FFFFFFF;intAns_count=0;intans_happy=0;intAns_point=0;intPATH[MAXN],ANS_PATH[MAXN];BOOLFLAG[MAXN];voidDfsintXintCostintHappyintPoint ) { if(Cost>ans_cost)return; if(x==des) { if(cost<ans_cost) {Ans_cost=Cost ; Ans_count=1; Ans_happy=Happy; Ans_point=Point ; for(intI=0; i<point;i++) Ans_path[i]=Path[i]; } Else if(cost==ans_cost) {Ans_count++; if(happy>ans_happy) {Ans_happy=Happy; Ans_point=Point ; for(intI=0; i<point;i++) Ans_path[i]=Path[i]; } Else if(happy==ans_happy) { if(point<ans_point) {Ans_point=Point ; for(intI=0; i<point;i++) Ans_path[i]=Path[i]; } } } return; } for(intI=0; I<g[x].size (); i++) { intId=G[x][i]; Path[point]=e[id].v; if(flag[e[id].v]==1)Continue; FLAG[E[ID].V]=1; DFS (E[id].v,cost+e[id].c,happy+h[e[id].v],point+1); FLAG[E[ID].V]=0; }}intMain () {scanf ("%d%d", &n,&m); Cin>>St; M1[ST]=++sz; m2[sz]=St; for(intI=1; i<=n-1; i++) { stringName Cin>>name; M1[name]=++sz; m2[sz]=name; intVal scanf"%d",&val); H[SZ]=Val; } des=m1["ROM"]; Tot=0; for(intI=1; i<=m;i++) { stringU,v;intC Cin>>u>>v>>C; E[tot++].u=m1[u]; E[TOT].V=M1[V]; E[tot].c=C; G[m1[u]].push_back (TOT); E[tot++].U=M1[V]; E[tot].v=m1[u]; E[tot].c=C; G[m1[v]].push_back (TOT); } memset (Flag,0,sizeofflag); flag[1]=1; DFS (1,0,0,0); printf ("%d %d%d%d\n", ans_count,ans_cost,ans_happy,ans_happy/ans_point); cout<<St; for(intI=0; i<ans_point;i++) cout<<" -"<<M2[ans_path[i]]; printf ("\ n"); return 0;}
PAT (Advanced level) 1087. All Roads leads to Rome (30)