最短路径问题 HDU3790 (dijkstra)

时间:2023-08-25 13:44:25

基础的dijkstra问题  加上了花费

#include<bits/stdc++.h>
using namespace std; int m1[][][];
int vis[];int dis[];
#define INF 99999
int n,e,cas;
int m;
int cos1[]; void dijkstra(int v0)
{
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++){dis[i]=(i==v0?:INF);cos1[i]=(i==v0?:INF);} vis[v0]=;
for(int i=;i<n-;i++)
{
int minn=INF,u=v0;
for(int j=;j<=n;j++)
{
if(vis[j]==&&dis[j]<minn)
{
u=j;minn=dis[j]; } }
vis[u]=;
for(int j=;j<=n;j++)
{
if(dis[u]+m1[u][j][]<dis[j])
{
dis[j]=dis[u]+m1[u][j][];
cos1[j]=cos1[u]+m1[u][j][];
}
else if(dis[u]+m1[u][j][]==dis[j]&&cos1[u]+m1[u][j][]<cos1[j])
{ cos1[j]=cos1[u]+m1[u][j][];
}
} } } int main()
{
while(scanf("%d%d",&n,&m)==&&(n+m) )
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j)m1[i][j][]=m1[i][j][]=;
else m1[i][j][]=m1[i][j][]=INF;
}
while(m--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if( m1[a][b][]>c )
{
m1[a][b][]=m1[b][a][]=c;
m1[a][b][]=m1[b][a][]=d; }
else if(m1[a][b][]==c&&d<m1[a][b][])
{
m1[a][b][]=m1[b][a][]=d; } }
int s,e;
scanf("%d%d",&s,&e);
dijkstra(s);
printf("%d %d\n",dis[e],cos1[e]); } }

回顾:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std; #define N 1005
#define inf 0x3f3f3f3f int n,e,m,s;
int vis[N],dis[N],mp[N][N];
int cost[N][N],cos[N]; void dijkstra(int s)
{
memset(vis,,sizeof vis);
for(int i=;i<=n;i++)
dis[i]=inf;
dis[s]=;
for(int i=;i<=n;i++)
cos[i]=inf;
cos[s]=;
for(int i=;i<=n;i++)
{
int minn=inf,u=-;
for(int j=;j<=n;j++)
if(dis[j]<minn&&!vis[j])
{
minn=dis[j];u=j;
}
if(u==-)return ;
vis[u]=;
for(int j=;j<=n;j++)
{
if(dis[j]>dis[u]+mp[u][j])
{
dis[j]=dis[u]+mp[u][j];
cos[j]=cos[u]+cost[u][j];
}
else if(dis[j]==dis[u]+mp[u][j])
{
cos[j]=min(cos[j],cos[u]+cost[u][j]);
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)==&&(n+m))
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j)mp[i][i]=;
else mp[i][j]=inf;
if(i==j)cost[i][i]=;
else cost[i][j]=inf;
}
while(m--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(mp[a][b]>c)
mp[a][b]=mp[b][a]=c,cost[a][b]=cost[b][a]=d;
}
scanf("%d%d",&s,&e);
dijkstra(s);
printf("%d %d\n",dis[e],cos[e]);
}
return ;
}