http://www.patest.cn/contests/pat-a-practise/1087
编一道题竟然用了90min,一次过,但是感觉速度好慢啊
还是经典的dij+dfs,题意比较好理解
注意点
1.map<int ,string>中虽然是string,但是push_back(char [])也是可以的
2.string不能pringf("%s",s),必须printf("%s",s.c_str())
#include <cstdio>
#include <map>
#include <string>
#include <string.h>
#include <vector>
#define MAX 210
using namespace std;
//这里不需要把char[]转为string
map <string,int> city;
map <int,string> cname;
int n,k;
int happy[MAX];
int g[MAX][MAX];
vector <int>pre[MAX];
vector <int>path;
vector <int>tmppath;
int des=-1;
int vis[MAX];
int dis[MAX];
void dij(){
for(int i=0;i<n;i++){
vis[i]=0;
dis[i]=-1;
}
int newp=0;
vis[newp]=1;
dis[newp]=0;
for(int i=0;i<n-1;i++){
for(int j=0;j<n;j++){
if(g[newp][j]!=-1 && vis[j]==0){
if(dis[j]==-1 || dis[j]>dis[newp]+g[newp][j]){
dis[j]=dis[newp]+g[newp][j];
pre[j].clear();
pre[j].push_back(newp);
}else if(dis[j]==dis[newp]+g[newp][j]){
pre[j].push_back(newp);
}
}
}
int min=1231231231;
for(int j=0;j<n;j++){
if(dis[j]!=-1 && vis[j]==0 && dis[j]<min){
newp=j;
min=dis[j];
}
}
vis[newp]=1;
}
}
void dfs(int x,int &cnt,int &maxhap,double &maxavg){
if(x==0){
tmppath.push_back(0);
cnt++;
int nn=tmppath.size()-1;
int tmaxhap=0;
for(int i=0;i<nn;i++){
tmaxhap+=happy[tmppath[i]];
}
double tmaxavg=(double)tmaxhap/nn;
if(tmaxhap>maxhap){
maxhap=tmaxhap;
maxavg=tmaxavg;
path=tmppath;
}else if(tmaxhap==maxhap && tmaxavg>maxavg){
maxavg=tmaxavg;
path=tmppath;
}
tmppath.pop_back();
return;
}else{
tmppath.push_back(x);
for(int i=0;i<pre[x].size();i++){
dfs(pre[x][i],cnt,maxhap,maxavg);
}
tmppath.pop_back();
}
}
int main(){
freopen("in.txt","r",stdin);
memset(g,-1,sizeof(g));
char c[5];
scanf("%d %d %s",&n,&k,c);
city[c]=0;
cname[0]=c;
happy[0]=0;
for(int i=1;i<n;i++){
int h;
scanf("%s %d",c,&h);
city[c]=i;
happy[i]=h;
cname[i]=c;
if(strcmp(c,"ROM")==0){
des=i;
}
}
for(int i=0;i<k;i++){
char c1[5],c2[5];
int w;
scanf("%s %s %d",c1,c2,&w);
map<string,int>::iterator a=city.find(c1),b=city.find(c2);
g[a->second][b->second]=w;
g[b->second][a->second]=w;
}
dij();
int cnt=0,maxhap=-1;
double maxavg=-1;
dfs(des,cnt,maxhap,maxavg);
printf("%d %d %d %d\n",cnt,dis[des],maxhap,(int)maxavg);
for(int i=path.size()-1;i>0;i--){
map<int,string>::iterator it=cname.find(path[i]);
printf("%s->",it->second.c_str());
}
printf("ROM\n");
return 0;
}