pat-1087

#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がマップのキーと値のペア情報を出力できない場合があります

2.最初の標準を2番目の標準から分離し、2番目の標準をdfsに入れます。先に進む前にエンドポイントが1でなければならないことに注意してください。そうしないと、セグメンテーションエラーが発生します。ノード数の情報に関しては各パス、それは単純ではありません追加するとき、dijsktraだけで見つけるのは簡単ではありません

3.最後に、dfsは逆の順序で終了点です->開始点と終了条件

英語

 

ポップバックの前に遭遇したdfとこれの違い

 

おすすめ

転載: blog.csdn.net/m0_45359314/article/details/112882902