#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
vector<int> tempath,anspath,pre[209];
map<string,int> si;
map<int,string>is;
const int inf=1000000000;
int cnt=0,maxav=0,maxvalue=0,anspre[209],ydis[209],a[209][209],n,m,happy[209],temph,tempc,visit[209],h[209];
string str1,str2;
void dfs (int f)//涉及到路径中点个数,只用dijkstra不好用了而只用它求第一权的最短路径
{tempath.push_back(f);//最后还要有一个转换系统双键值对
if(f==1)//注意他是倒着来的这里应为起点
{ int value=0;
for(int i=0;i<tempath.size();i++)
value+=happy[tempath[i]];
int avalue=0;
avalue=value/(tempath.size()-1);//不包括第一个位置注意
if(value>maxvalue){
maxvalue=value;
anspath=tempath;
maxav=avalue;
}
else if(value==maxvalue&&avalue>maxav){
anspath=tempath;
maxav=avalue;
}
cnt++;//从djsktra挑出的已是最短的了
tempath.pop_back();//前面的还有用,必须有否则在下一个会段错误已经到终点就应该再退回去,不要少这个退回去的步骤(注意)
return;
}
for(int i=0;i<pre[f].size();i++){
dfs(pre[f][i]);
}
tempath.pop_back();
}
int main(){
fill(a[0],a[0]+209*209,inf);
fill(ydis,ydis+209,inf);
cin>>n>>m>>str1;
si[str1]=1;is[1]=str1;//0会和没有冲突1-n
for(int i=0;i<n-1;i++)
{
cin>>str2>>temph;
si[str2]=i+2;is[i+2]=str2;
happy[i+2]=temph;
}
for(int i=0;i<m;i++)
{
cin>>str1>>str2>>tempc;
a[si[str1]][si[str2]]=a[si[str2]][si[str1]]=tempc;
}
for(int i=1;i<=n;i++)
anspre[i]=i;
ydis[1]=0;
for(int i=0;i<n;i++)
{int u=-1,min=inf;
for(int j=1;j<=n;j++){
if(visit[j]==0&&ydis[j]<min){
u=j;
min=ydis[j];
}
}
if(u==-1) break;
visit[u]=1;
for(int v=1;v<=n;v++){
if(visit[v]==0&&a[u][v]!=inf){
if(ydis[u]+a[u][v]<ydis[v]){
ydis[v]=ydis[u]+a[u][v];
pre[v].clear();
pre[v].push_back(u);
//hv 到这个点总共的权值
}
else if(ydis[u]+a[u][v]==ydis[v]){
pre[v].push_back(u);
}
}
}
}
dfs(si["ROM"]);
printf("%d %d %d %d\n",cnt,ydis[si["ROM"] ],maxvalue,maxav);
for(int i=anspath.size()-1;i>=0;i--)
{//printf("%s",is[anspath[i]]);
cout<<is[anspath[i]];//当用printf 对map弄不了就用cout<<~~
if(i!=0) printf("->");
}
return 0;
}
总结
1.printf有时不能输出map键值对的信息
2.将第一标准与第二标准分开,第二标准放在dfs中求,注意到终点要出一个再进行不然会出现段错误,当涉及到每条路径结点个数的信息而不是简单相加时,此时只用dijsktra不好求
3.最后dfs它是逆序求的终点->起点终止条件
英语
问题popback 之前遇到的dfs与这的区别