题目链接:点击打开链接
题目大意:略。
解题思路:注意:if(v==-1) return 0; 和 for(int i=1;i<n-1;i++) 的理解。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=510;
int n,m,s,e;
int vis[maxn], dis[maxn], cst[maxn];
int mp[maxn][maxn], cost[maxn][maxn];
void init()
{
mem(vis,0); mem(dis,0); mem(cst,0);
mem(mp,INF); mem(cost,INF);
}
int dijkstra(int s)
{
for(int i=0;i<n;i++)
{
dis[i]=mp[s][i];
cst[i]=cost[s][i];
}
vis[s]=1, dis[s]=0;
// 这里 for_i 只需要循环(n-2)次即可,因为上面 s 已经算出一次,以及末尾的 e 不需要计算
for(int i=1;i<n-1;i++)
{
int v=-1,mi=INF;
for(int j=0;j<n;j++)
{
if(!vis[j] && dis[j]<mi)
mi=dis[j], v=j;
}
if(v==-1) return 0;
vis[v]=1;
for(int j=0;j<n;j++)
{
if(!vis[j] && mp[v][j]+mi<dis[j])
{
dis[j]=mp[v][j]+mi;
cst[j]=cost[v][j]+cst[v];
}
else if(!vis[j] && mp[v][j]+mi==dis[j] && cst[j]>cost[v][j]+cst[v])
cst[j]=cost[v][j]+cst[v];
}
}
}
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&s,&e))
{
init();
int u,v,a,b;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d",&u,&v,&a,&b);
mp[u][v]=mp[v][u]=a;
cost[u][v]=cost[v][u]=b;
}
if(dijkstra(s)) printf("%d %d\n",dis[e],cst[e]);
else puts("-1");
}
return 0;
}