数据结构实验之图论七:驴友计划
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。
输入
连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。
输出
在同一行中输出路径长度和收费总额,数据间用空格间隔。
示例输入
1
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
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。
输入
连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。
输出
在同一行中输出路径长度和收费总额,数据间用空格间隔。
示例输入
1
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
# include <stdio.h>
# include <memory.h>
# define MAXN 500
# define MAXM 100000
# define INF 9999999
int N,M,s,d;
struct node
{
int w,cost;
} Edge[MAXN][MAXN];
int dist[MAXN]; //记录没在生成树上的顶点到源点的最近距离
//int path[MAXN];
int S[MAXN];//记录各点是否在生成树上,在生成树上标记为1
int cost[MAXN];//记录源点到各点的费用
void Dijkstra();
int main()
{
int T,u,v,w,cost;
int i,j,k;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&N,&M,&s,&d);//输入城市数目,公路条数,出发点,目的点
/*初始化邻接矩阵各点间的权值*/
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
Edge[i][j].w = INF;
}
}
for(i=0;i<M;i++)
{
scanf("%d%d%d%d",&u,&v,&w,&cost);
if(Edge[u][v].w > w)
{
Edge[u][v].w = Edge[v][u].w = w;
Edge[u][v].cost = Edge[v][u].cost = cost;
}
}
Dijkstra();
}
return 0;
}
void Dijkstra()
{
int i,j,k;
memset(S,0,sizeof(S));
for(i=0;i<N;i++)
{
dist[i] = Edge[s][i].w;// 初始化dist为邻接矩阵的第s行的w
cost[i] = Edge[s][i].cost;//初始化cost为邻接矩阵第s行的cost
}
S[s] = 1;//s已在生成树上
dist[s] = 0;
for(i=0;i<N;i++)
{
int Min = INF;
int u = s;
/*找到不在生成树上,dis最小的点加入生成树*/
for(j=0;j<N;j++)
{
if(!S[j] && dist[j] < Min)
{
Min = dist[j];
u = j;
}
}
S[u] = 1;
/*更新没访问过的点的 dist cost*/
for(k=0;k<N;k++)
{
if(!S[k] && Edge[u][k].w <INF)
{
/*经过u点到达k点距离更短*/
if(dist[u]+Edge[u][k].w < dist[k])
{
dist[k] = dist[u] + Edge[u][k].w;
cost[k] = cost[u] + Edge[u][k].cost;
}
/*经过u点到达k点与其他路径距离相等*/
else if(dist[u] + Edge[u][k].w == dist[k])
{
/*!!!但是经过u点到达k点费用更少*/
if(cost[u] + Edge[u][k].cost < cost[k])
{
cost[k] = cost[u] + Edge[u][k].cost;
}
}
}
}
}
printf("%d %d\n",dist[d],cost[d]);
}