模板
Dijkstra + DFS
注意
1.邻接矩阵要初始化
2.松弛的路径也需要初始化
3.DFS需要回溯
4. id = tmpPath[i] 才表示顶点,不能直接用i
#include<cstdio>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int N,M,S,D;
int p[505]; //点权
const int maxv = 1005;
const int INF = 0x3fffffff;
int G[maxv][maxv]; //邻接矩阵图
int d[maxv]; //最短路径
bool vis[maxv]={false};
vector<int> pre[maxv]; //逆序保存前驱节点
vector<int> tmpPath, path;
int optValue=-1,num=0;
//Dijkstra
void Dijkstra(int s){
fill(d, d+maxv, INF);
d[s] = 0;
for(int i=0;i<N;i++){
int u = -1,MIN = INF;
for(int j=0;j<N;j++){
if(vis[j]==false && d[j] < MIN){
MIN = d[j];
u = j;
}
}
if(u == -1) return ;
vis[u] = true;
for(int v =0; v<N; v++){
if(vis[v]==false && G[u][v]!= INF){
if(d[u] + G[u][v] < d[v]){
d[v] = d[u] + G[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(d[u] + G[u][v] == d[v]){
pre[v].push_back(u);
}
}
}
}
}
//DFS
void DFS(int v){
//递归边界
if(v == S){
num++;
tmpPath.push_back(v);
int value=0;
for(int i=tmpPath.size()-1;i>=0;i--){
int id = tmpPath[i];
value += p[id];
}
if(value > optValue){
optValue = value;
path = tmpPath;
}
tmpPath.pop_back();
return;
}
//递归式
tmpPath.push_back(v);
for(int i=0;i<pre[v].size();i++){
DFS(pre[v][i]);
}
tmpPath.pop_back();
}
//主函数
int main(){
cin>>N>>M>>S>>D;
//邻接矩阵需要初始化!!!!
//邻接矩阵需要初始化!!!!
//邻接矩阵需要初始化!!!!
fill(G[0], G[0]+maxv*maxv, INF);
for(int i=0;i<N;i++){
cin>>p[i];
}
int u,v,w;
for(int i=0;i<M;i++){
cin>>u>>v>>w;
G[u][v]=G[v][u]=w;
}
Dijkstra(S);
DFS(D);
cout<<num<<" "<<optValue<<endl;
for(int i=path.size()-1;i>=0;i--){
int id = path[i];
cout<<id;
if(i!=0) cout<<" ";
else cout<<endl;
}
return 0;
}