题目地址
题意
找到cost最少的最短路
解题思路
这个题目的解法可以说是很PAT了,dijkstra求出最短路距离后,dfs找到所有最短路比较cost,和之前写的1018一模一样。
代码
这里N只有500,为了方便就用邻接矩阵了(写完发现代码貌似比直接用vector还长。。。)。注意初始化inf就行了,这个题没什么细节。
#include<bits/stdc++.h>
using namespace std;
int n,m,S,D,a,b,c,dd,x;
#define N 507
#define inf 0x3f3f3f3f
typedef pair<int ,int >P;
priority_queue<P,vector<P>,greater<P>> Q;
int dis[N][N],cost[N][N];
int d[N];
void dijkstra(int S){
for(int i=0;i<n;i++) d[i]=inf;
d[S]=0;
Q.push(P(0,S));
while(!Q.empty()){
P f=Q.top();Q.pop();
if(f.first>d[x=f.second]) continue;
for(int i=0;i<n;i++){
if(d[i]>d[x]+dis[x][i])
Q.push(P(d[i]=d[x]+dis[x][i],i));
}
}
}
int mincost=1e9;
bool vis[N];
vector<int> path,minpath;
void dfs(int nowpos,int nowdis,int nowcost){
if(nowdis>d[D]) return;
vis[nowpos]=1;
path.push_back(nowpos);
if(nowdis==d[D]&&nowpos==D){
if(nowcost<mincost){
mincost=nowcost;
minpath=path;
}
}
for(int i=0;i<n;i++)
if(dis[nowpos][i]!=inf&&!vis[i])
dfs(i,nowdis+dis[nowpos][i],nowcost+cost[nowpos][i]);
vis[nowpos]=0;
path.pop_back();
}
int main(){
cin>>n>>m>>S>>D;
memset(cost,0x3f,sizeof(cost));
memset(dis,0x3f,sizeof(dis));
for(int i=0;i<n;i++) cost[i][i]=dis[i][i]=0;
for(int i=0;i<m;i++)
{
cin>>a>>b>>c>>dd;
dis[a][b]=dis[b][a]=c;
cost[a][b]=cost[b][a]=dd;
}
dijkstra(S);
dfs(S,0,0);
for(int e:minpath) cout<<e<<' ';
cout<<d[D]<<' '<<mincost;
return 0;
}