#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0xfffffff
int vis[1010];//标记数组
int n,m,s,d;
struct node
{
int l,c;
}pri[1010][1010],discost[1010];
void dijkstra(int s)
{
memset(vis,0,sizeof(vis));
vis[s]=1;
for(int i=0;i<n;i++)
{
discost[i].l=pri[s][i].l;
discost[i].c=pri[s][i].c;
}
for(int i=0;i<n;i++)
{
int Ml=INF,Mc=INF,k=-1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&discost[j].l<=Ml)
{
if((discost[j].l==Ml&&discost[j].c<Mc)||discost[j].l<Ml)
{
Ml=discost[j].l;
Mc=discost[j].c;
k=j;
}
}
}
if(k==-1)
return;
vis[k]=1;
for(int j=0;j<n;j++)
if(!vis[j]&&discost[j].l>=discost[k].l+pri[k][j].l)
{
if( (discost[j].l>discost[k].l+pri[k][j].l) || (discost[j].l==discost[k].l+pri[k][j].l && discost[j].c>discost[k].c+pri[k][j].c))
{
discost[j].l=discost[k].l+pri[k][j].l;
discost[j].c=discost[k].c+pri[k][j].c;
}
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
pri[i][j].l=i==j?0:INF;
pri[i][j].c=i==j?0:INF;
}
for(int i=1;i<=m;i++)
{
int a,b,l,c;
scanf("%d%d%d%d",&a,&b,&l,&c);
if(pri[a][b].l>l)
{
pri[a][b].l=pri[b][a].l=l;
pri[a][b].c=pri[b][a].c=c;
}
}
dijkstra(s);
printf("%d %d\n",discost[d].l,discost[d].c);
return 0;
}
旅游规划
最新推荐文章于 2023-04-01 16:48:25 发布