本题是一个较为单纯的迪杰斯特拉算法,有两个权重<距离,费用>。根据题意先找出最短路,若最短路有若干条,则选最小费用的那条。需要注意的是此图初始化是一个无向图...........因为这个WA了N次
#include<bits/stdc++.h>
#define maxsize 505
#define inf 9999999
using namespace std;
int dist[maxsize];
int spend[maxsize][maxsize];
int g[maxsize][maxsize];
int cost[maxsize];
bool check[maxsize];
int n,m,s,d,mins,min_cost;
int c1,c2,h,f;
void dj();
void pre_deal();
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&d);
pre_deal();
for(int i=0;i<m;i++)///初始化无向图
{
scanf("%d%d%d%d",&c1,&c2,&h,&f);
g[c1][c2]=h;
g[c2][c1]=h;
spend[c1][c2]=f;
spend[c2][c1]=f;
}
dj();
printf("%d %d\n",dist[d],cost[d]);
return 0;
}
void pre_deal()///预处理权重为正无穷
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
g[i][j]=inf;
spend[i][j]=inf;
}
}
}
void dj()
{
for(int i=0;i<n;i++)
{
if(g[s][i]!=inf)///初始化源点的邻节点
{
dist[i]=g[s][i];
cost[i]=spend[s][i];
}
else
dist[i]=inf;
}
check[s]=true;///开始将源点加入最短路集合
int w;
for(int i=1;i<n;i++)
{
mins=inf;
for(int j=0;j<n;j++)///从剩余集合中选取最短距离
if(!check[j]&&dist[j]<mins)
{
mins=dist[j];
w=j;
}
check[w]=true;///加入最短路集合
for(int j=0;j<n;j++)
{
if(!check[j])
if(dist[w]+g[w][j]<dist[j])///因为将w加入了最短路集合,所以要对剩余顶点进行更新
{
dist[j]=dist[w]+g[w][j];
cost[j]=cost[w]+spend[w][j];
}
else if((dist[w]+g[w][j])==dist[j]&&(cost[w]+spend[w][j]<cost[j]))///有若干最短路时选取最小费用
cost[j]=cost[w]+spend[w][j];
}
}
}