其实这道题目,看起来是最基础的题目,但是其中也遍布了一些,应该记住的知识点:比如,构造矩阵的时候,一定要考虑的筛除重边的情况,然后就是注意在长度一样的情况下,怎么样筛除相对价钱较高的,留下较低的.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define inf 0xfffffff
int N,M;
int visit[1100];
int map[1100][1100];
int wei[1100][1100];
int dis[1100];
int co[1100];
int cost;
int S,E;
void dijkstra(int s)
{
for(int i=1;i<=N;i++)
dis[i]=inf;
dis[s]=0;
co[s]=0;
for(int j=1;j<=N;j++)
{
int t=inf,pos;
for(i=1;i<=N;i++)
{
if(!visit[i]&&t>dis[i])
{
t=dis[i];
pos=i;
}
}
visit[pos]=1;
for(i=1;i<=N;i++)
{
if(!visit[i]&&dis[i]>map[pos][i]+dis[pos]&&map[pos][i]!=0x3f3f3f3f)
{
dis[i]=map[pos][i]+dis[pos];
co[i]=wei[pos][i]+co[pos];
}
else if(!visit[i]&&dis[i]==map[pos][i]+dis[pos]&&co[i]>wei[pos][i]+co[pos]&&wei[pos][i]!=0x3f3f3f3f)
{
co[i]=wei[pos][i]+co[pos];
}
}
}
printf("%d %d\n",dis[E],co[E]);
}
int main()
{
while(scanf("%d%d",&N,&M),N|M)
{
memset(map,0x3f,sizeof(map));//可以通过memset()对字节复制操作赋值成相对较大的值
memset(visit,0,sizeof(visit));
memset(wei,0x3f,sizeof(wei));
int a,b,c,d;
cost=0;
for(int i=1;i<=M;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if (c < map[a][b]) {//处理重边情况.
map[a][b]=c;
map[b][a]=c;
wei[a][b]=d;
wei[b][a]=d;
}
}
scanf("%d%d",&S,&E);
dijkstra(S);
}
return 0;
}
这是又写了一遍就成功的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define inf 0x3fffffff
int N,M;//N represents the number of points,and M stands for the number of edges;
int sta,end;
int map[1005][1005];
int visit[1005];
int dis[1005];
int price[1005];
int val[1005][1005];
void dijkstra()
{
memset(visit,0,sizeof(visit));
memset(price,0,sizeof(price));
for(int i=1;i<=N;i++)
dis[i]=inf;
dis[sta]=0;
for(int j=1;j<=N;j++)
{
int t=inf;
int pos;
for(int i=1;i<=N;i++)
{
if(!visit[i]&&t>dis[i])
{
t=dis[i];
pos=i;
}
}
visit[pos]=1;
for(i=1;i<=N;i++)
{
if(!visit[i]&&map[pos][i]!=0x3f3f3f3f&&dis[i]>dis[pos]+map[pos][i])
{
dis[i]=dis[pos]+map[pos][i];
price[i]=price[pos]+val[pos][i];
}
else if(!visit[i]&&dis[i]==dis[pos]+map[pos][i]&&price[i]>price[pos]+val[pos][i])
{
price[i]=price[pos]+val[pos][i];
}
}
}
printf("%d %d\n",dis[end],price[end]);
return ;
}
int main()
{
while(scanf("%d%d",&N,&M),N|M)
{
int a,b,c,d;
memset(map,0x3f,sizeof(map));
for(int i=1;i<=M;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(map[a][b]>c)
{
map[a][b]=c;
map[b][a]=c;
val[a][b]=d;
val[b][a]=d;
}
}
scanf("%d%d",&sta,&end);
dijkstra();
}
return 0;
}