//
// main.cpp
// PAT_1030. Travel Plan
//
// Created by wjq on 17/4/14.
// Copyright © 2017年 wjq. All rights reserved.
//
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
struct node
{
int to;
int dist;
int cost;
};
vector<node> G[505];
int mindist=99999999,mincost=99999999;
int vis[505];
int path[505]; //用来保存路径
int NextCity[505];
int N,M,S,D;
void dfs(int i,int dist,int cost)
{
if(dist>mindist)
return;
if(i==D)
{
if(dist<mindist)
{
mindist=dist;
mincost=cost;
memcpy(path,NextCity,sizeof(path));
}
else if(dist==mindist&&cost<mincost)
{
mincost=cost;
memcpy(path,NextCity,sizeof(path));
}
return;
}
for(int j=0;j<G[i].size();j++)
{
if(vis[G[i][j].to]==1)
continue;
vis[G[i][j].to]=1;
NextCity[i]=G[i][j].to;
dfs(G[i][j].to,dist+G[i][j].dist,cost+G[i][j].cost);
vis[G[i][j].to]=0;
}
}
int main(int argc, const char * argv[])
{
scanf("%d%d%d%d",&N,&M,&S,&D);
for(int i=0;i<M;i++)
{
int City1,City2,Distance,Cost;
scanf("%d%d%d%d",&City1,&City2,&Distance,&Cost);
node temp1,temp2;
temp1.to=City2,temp1.dist=Distance,temp1.cost=Cost;
temp2.to=City1,temp2.dist=Distance,temp2.cost=Cost;
G[City1].push_back(temp1);
G[City2].push_back(temp2);
}
vis[S]=1;
dfs(S,0,0);
while(S!=D)
{
printf("%d ",S);
S=path[S];
}
cout<<D<<" "<<mindist<<" "<<mincost;
}
类似的题如PAT1003 PAT1018
就是用dfs来做的.注意保存路径的方式和输出就可以了.