您的位置:首页 > Web前端 > JavaScript

HDOJ 2112 HDU Today (Dijstra 此题略坑)

2016-02-04 14:36 435 查看
点击打开链接

此题坑点:

1、 无向图 公交车两个站点间可来回

2、可能有起点终点不出现在后面的公交站点的情况 计算最短路时必须包括所有的提到的站点

3、起点等于终点的情况输出的是0

另外之前写的程序还有几个bug没有记录,顺便也提一下:

1、EOF = -1 Ctrl + Z 读入 EOF

2、min max最好不要当变量

3、C++ 区分大小写,大小写不同就是不同的变量

4、定义较大的数组要在主函数外

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<map>
const int INF = 0x3f3f3f3f;
using namespace std;
int c[155][155];
bool s[155];
int dist[155];
int main()
{
map <string, int> name;
int cnt, u, a, b, time, mindist, v0, t0, n;
string sv, st, sa, sb;
while (~scanf("%d", &n) && n != -1)
{
getchar();
cnt = 0;
name.clear();
cin >> sv >> st;
if (name.find(sv) == name.end())
{
cnt++;
name[sv] = cnt;
}
if (name.find(st) == name.end())
{
cnt++;
name[st] = cnt;
}
for (int i = 1; i <= 150; i++)
for (int j = 1; j <= 150; j++) c[i][j] = INF;
for (int i = 1; i <= n; i++)
{
cin >> sa >> sb >> time;
if (name.find(sa) != name.end()) a = name[sa];
else
{
cnt++;
name[sa] = cnt;
a= cnt;
}
if (name.find(sb) != name.end()) b = name[sb];
else
{
cnt++;
name[sb] = cnt;
b = cnt;
}
if (time < c[a][b])
{
c[a][b] = time;
c[b][a] = time;
}
}
v0 = name[sv];
t0 = name[st];
for (int i = 1; i <= cnt; i++)
{
s[i] = false;
dist[i] = c[v0][i];
}
s[v0] = true;
dist[v0] = 0;
for (int i = 1; i < cnt; i++)
{
u = v0;
mindist = INF;
for (int j = 1; j <= cnt; j++)
if (!s[j] && dist[j] < mindist)
{
mindist = dist[j];
u = j;
}
s[u] = true;
for (int j = 1; j <= cnt; j++)
if (!s[j] && c[u][j] != INF)
{
if (c[u][j] + dist[u] <dist[j]) dist[j] = c[u][j] + dist[u];
}
}
if (dist[t0] != INF) printf("%d\n", dist[t0]);
else printf("-1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: