您的位置:首页 > 其它

[复习记录] 浙大 PAT 甲级 1111 Online Map 带有等长路径选择策略的、用邻接矩阵实现的disktra算法 DFS

2019-09-05 10:06 369 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_39115541/article/details/100552417
[code]#include<stdio.h>
#include<vector>
#define INF 10000000;
using namespace std;

int length[500][500];
int time[500][500];
int dis[500], dispre[500], timepre[500], weight[500];

vector<int> lengthRoute, timeRoute;

void getLengthRoute(int i, int start)
{
lengthRoute.push_back(i);
if (i == start)
{
return;
}
getLengthRoute(dispre[i], start);
}

void getTimeRoute(int i, int start)
{
timeRoute.push_back(i);
if (i == start)
{
return;
}
getTimeRoute(timepre[i], start);
}

int main()
{
int N, M;
scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
length[i][j] = -1;
time[i][j] = -1;
}
}
for (int i = 0; i < M; i++)
{
int v1, v2, oneway, l, t;
scanf("%d%d%d%d%d", &v1, &v2, &oneway, &l, &t);
length[v1][v2] = l;
time[v1][v2] = t;
if (oneway == 0)
{
length[v2][v1] = l;
time[v2][v1] = t;
}
}
int start, end;
scanf("%d%d", &start, &end);
bool visit[500];
for (int i = 0; i < N; i++)
{
dis[i] = -1;
dispre[i] = i;
visit[i] = false;
weight[i] = INF;
}
dis[start] = 0;
weight[start] = 0;
for (int i = 0; i < N; i++)
{
int update = -1, min = INF;
for (int j = 0; j < N; j++)
{
if (visit[j] == false && dis[j] != -1 && dis[j] < min)
{
update = j;
min = dis[j];
}
}
if (update == -1)
{
break;
}
visit[update] = true;
for (int j = 0; j < N; j++)
{
if (visit[j] == false && length[update][j] != -1)
{
if (dis[j] == -1 || length[update][j] + dis[update] < dis[j])
{
dis[j] = length[update][j] + dis[update];
dispre[j] = update;
weight[j] = weight[update] + time[update][j];
}
else if (dis[j] != -1 && length[update][j] + dis[update] == dis[j] && weight[j] > weight[update] + time[update][j])
{
weight[j] = weight[update] + time[update][j];
dispre[j] = update;
}
}
}
}
getLengthRoute(end, start);
int ansLength = dis[end];
for (int i = 0; i < N; i++)
{
dis[i] = -1;
visit[i] = false;
weight[i] = INF;
timepre[i] = i;
}
dis[start] = 0;
weight[start] = 0;
for (int i = 0; i < N; i++)
{
int update = -1, min = INF;
for (int j = 0; j < N; j++)
{
if (visit[j] == false && dis[j] != -1 && dis[j] < min)
{
min = dis[j];
update = j;
}
}
if (update == -1)
{
break;
}
visit[update] = true;
for (int j = 0; j < N; j++)
{
if (visit[j] == false && time[update][j] != -1)
{
if (dis[j] == -1 || dis[j] > dis[update] + time[update][j])
{
timepre[j] = update;
dis[j] = dis[update] + time[update][j];
weight[j] = weight[update] + 1;
}
else if (dis[j] != -1 && time[update][j] + dis[update] == dis[j] && weight[j] > weight[update] + 1)
{
timepre[j] = update;
weight[j] = weight[update] + 1;
}
}
}
}
getTimeRoute(end, start);
int ansTime = dis[end];
bool isDistinct = false;
if (timeRoute.size() != lengthRoute.size())
{
isDistinct = true;
}
else
{
for (int i = 0; i < timeRoute.size(); i++)
{
if (timeRoute[i] != lengthRoute[i])
{
isDistinct = true;
break;
}
}
}
if (!isDistinct)
{
printf("Distance = %d; Time = %d: %d", ansLength, ansTime, start);
for (int i = lengthRoute.size() - 2; i >= 0; i--)
{
printf(" -> %d", lengthRoute[i]);
}
printf("\n");
}
else
{
printf("Distance = %d: %d", ansLength, start);
for (int i = lengthRoute.size() - 2; i >= 0; i--)
{
printf(" -> %d", lengthRoute[i]);
}
printf("\n");
printf("Time = %d: %d", ansTime, start);
for (int i = timeRoute.size() - 2; i >= 0; i--)
{
printf(" -> %d", timeRoute[i]);
}
printf("\n");
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: