DFS+Dijkstra算法的综合应用
思路一:只用Dijkstra算法,代码如下:
#include<bits/stdc++.h>
using namespace std;
int Map[510][510],cost[510][510],dist[510],w[510];
int n,m,s,d;
const int inf=0x3fffffff;
bool vis[510]={false};
int pre[510];
int sum=0;
void Dijks(int start)
{
fill(vis,vis+510,false);
fill(dist,dist+510,inf);
fill(w,w+510,0);
dist[start]=0;
w[start]=0;
for(int i=0;i<n;i++)
{
int u=-1,Min=inf;
for(int j=0;j<n;j++)
{
if(vis[j]==false&&dist[j]<Min)
{
u=j;
Min=dist[j];
}
}
if(u==-1)return;
vis[u]=true;
for(int j=0;j<n;j++)
{
if(vis[j]==false&&Map[u][j]<inf)
{
if(dist[u]+Map[u][j]<dist[j])
{
dist[j]=Map[u][j]+dist[u];
w[j]=w[u]+cost[u][j];
pre[j]=u;
}
else if(dist[u]+Map[u][j]==dist[j])
{
if(w[j]>w[u]+cost[u][j])
{
w[j]=w[u]+cost[u][j];
pre[j]=u;
}
}
}
}
}
}
void dfs(int last)
{
if(last==s)
{
printf("%d ",last);
return;
}
dfs(pre[last]);
printf("%d ",last);
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&d);
fill(Map[0],Map[0]+510*510,inf);
fill(cost[0],cost[0]+510*510,inf);
int a,b,dis,cos;
for(int i=0;i<n;i++)
pre[i]=i;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&dis,&cos);
Map[a][b]=Map[b][a]=dis;
cost[a][b]=cost[b][a]=cos;
}
Dijks(s);
dfs(d);
printf("%d %d",dist[d],w[d]);
}
思路二:
DFS+Dijkstra算法的综合应用
代码如下:
#include<bits/stdc++.h>
using namespace std;
int Map[510][510],cost[510][510],dist[510],w[510];
int n,m,s,d;
const int inf=0x3fffffff;
bool vis[510]={false};
int allcost;
vector<int>pre[510];//前驱
vector<int>tempPath,Path;//临时路径,最优路径
void Dijks(int start)
{
fill(vis,vis+510,false);
fill(dist,dist+510,inf);
fill(w,w+510,0);
dist[start]=0;
w[start]=0;
for(int i=0;i<n;i++)
{
int u=-1,Min=inf;
for(int j=0;j<n;j++)
{
if(vis[j]==false&&dist[j]<Min)
{
u=j;
Min=dist[j];
}
}
if(u==-1)return;
vis[u]=true;
for(int j=0;j<n;j++)
{
if(vis[j]==false&&Map[u][j]<inf)
{
if(Map[u][j]+dist[u]<dist[j])
{
dist[j]=Map[u][j]+dist[u];
pre[j].clear();
pre[j].push_back(u);
}
else if((Map[u][j]+dist[u]==dist[j]))
{
pre[j].push_back(u);
}
}
}
}
}
void dfs(int v)
{
if(s==v)
{
int tempcost=0;
tempPath.push_back(v);
for(int i=tempPath.size()-1;i>0;i--)
{
int id=tempPath[i],next=tempPath[i-1];
tempcost+=cost[id][next];
}
if(tempcost<allcost)
{
allcost=tempcost;
Path=tempPath;
}
tempPath.pop_back();
return;
}
tempPath.push_back(v);
for(int i=0;i<pre[v].size();i++)
{
dfs(pre[v][i]);
}
tempPath.pop_back();
}
int main()
{
allcost=inf;
scanf("%d%d%d%d",&n,&m,&s,&d);
fill(Map[0],Map[0]+510*510,inf);
fill(cost[0],cost[0]+510*510,inf);
int a,b,dis,cos;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&dis,&cos);
Map[a][b]=Map[b][a]=dis;
cost[a][b]=cost[b][a]=cos;
}
Dijks(s);
dfs(d);
for(int i=Path.size()-1;i>=0;i--)
{
printf("%d ",Path[i]);
}
printf("%d %d",dist[d],allcost);
}