给出n个城市与m条公路,Start与End城市
求出最短的路径长度 与最低耗费(路径最短优先,路径长度一样耗费低的优先)
输入:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
输出:3 40
//注释掉的是Floyd算法,未注释的是Dijkstra
/*#include<iostream>
using namespace std;
int N,M,Start,End,a,b,c,d;
const int INF=0x3f3f3f3f;
int mp[502][502][2]; //0是距离 1是花费
int main()
{
cin>>N>>M>>Start>>End;
ios::sync_with_stdio(0);
for(int i=0;i<N;i++){ //初始化路径以及花费的数据
for(int j=0;j<=i;j++){
mp[i][j][0]=mp[j][i][0]=INF;
mp[i][j][1]=mp[j][i][1]=INF;
}
}
for(int i=0;i<M;i++)
{
cin>>a>>b>>c>>d;
mp[a][b][0]=mp[b][a][0]=c;
mp[a][b][1]=mp[b][a][1]=d;
}
for(int k=0;k<N;k++){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(mp[i][k][0]+mp[k][j][0]<mp[i][j][0]||(mp[i][k][0]+mp[k][j][0]==mp[i][j][0]&&mp[i][k][1]+mp[k][j][1]<mp[i][j][1]))
{
mp[i][j][0]=mp[i][k][0]+mp[k][j][0];
mp[i][j][1]=mp[i][k][1]+mp[k][j][1];
}
}
}
}
cout<<mp[Start][End][0]<<" "<<mp[Start][End][1];
}
*/
#include<iostream>
using namespace std;
int mp1[502][502],mp2[502][502],vis[502],dis[502],cost[502];
int N,M,Start,End,a,b,c,d;
const int INF=0x3f3f3f3f;
//基本思路就是找距离初始结点最近的节点(now),然后对这个几点的所有邻接结点进行判断
//如果dis[now]+mp1[now][next]<dis[next](当然初始化为dis都为最大值)
//那么就更新dis[next]
//N个结点都进行一次上述操作 从Start开始 用vis判断是否进行过
void dijkstra()
{
vis[Start]=1; //判断完一个节点后就标记一下
for(int i=0;i<N-1;i++) //把Start不用判断了 对余下的n-1个结点都进行dijkstra
{
int minx=INF,now;
for(int i=0;i<N;i++) //找与初始结点最近的结点
{
if(!vis[i]&&dis[i]<minx)
{
minx=dis[i];
now=i;
}
}
if(minx==INF)break; //找不到了就退出
vis[now]=1; //标记一下这个节点
//下面就是对这个结点的所有邻接节点进行判断
for(int i=0;i<N;i++)
{
//如果不相邻距离就是+无穷 所以不用考虑
if(!vis[i]&&dis[now]+mp1[now][i]<dis[i]) //如果路径更短就更新
{
dis[i]=mp1[now][i]+dis[now];
cost[i]=mp2[now][i]+cost[now];
} //如果路径长度相同但是花费更短就更新
else if(!vis[i]&&dis[i]==dis[now]+mp1[now][i]&&cost[now]+mp2[now][i]<cost[i])
{
cost[i]=cost[now]+mp2[now][i];
}
}
}
}
int main()
{
cin>>N>>M>>Start>>End;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
mp1[i][j]=mp1[j][i]=INF; //初始化距离都是最大值
mp2[i][j]=mp2[j][i]=INF;
}
}
for(int i=0;i<M;i++)
{
cin>>a>>b>>c>>d;
mp1[a][b]=mp1[b][a]=c; //录入数据
mp2[a][b]=mp2[b][a]=d;
}
for(int i=0;i<N;i++)
{
dis[i]=mp1[Start][i],cost[i]=mp2[Start][i]; //初始化每个结点到起点的花费与路径,以后更改的就是这两个变量
}
dis[Start]=0,cost[Start]=0;
dijkstra();
//printf("到终点End的最短路径是:%d 最短路径上的花费是:%d",dis[End],cost[End]);
printf("%d %d",dis[End],cost[End]);
}