题目来源:poj 1502
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
const int maxn = 110;
const int INF = 0x3fff;
int G[maxn][maxn];
bool vis[maxn] = {false};
int dis[maxn];
int N;
void Dijkstra()
{
dis[1] = 0;
for (int i = 1; i <= N; i++) //循环n次
{
int u = -1; //使d[u]最小且还没有被访问的结点
int min = INF;
for (int j = 1; j <= N; j++)
{
if (vis[j] == false && dis[j] < min)
{
u = j;
min = dis[j];
}
}
if (u == -1)
{
break;
}
vis[u] = true;
for (int i = 1; i <= N; i++)
{
if (vis[i] == false && G[u][i] != INF && dis[i] > dis[u] + G[u][i])
{
dis[i] = dis[u] + G[u][i];
}
}
}
}
int change(string s)
{
int ans = 0;
int len = s.length();
for (int i = 0; i <= len - 1; i++)
{
if (i == 0)
{
ans += (s[i] - '0');
}
else
{
ans = ans * 10 + (s[i] - '0');
}
}
return ans;
}
int main()
{
cin >> N;
fill(G[0], G[0] + maxn * maxn, INF);
fill(vis, vis + maxn, false);
fill(dis, dis + maxn, INF);
for (int i = 1; i <= N; i++)
{
G[i][i] = 0;
}
string str;
getchar();
for (int i = 2; i <= N; i++)
{
getline(cin, str);
istringstream stream(str);
string s;
for (int j = 1; j < i; j++)
{
stream >> s;
if (s == "x")
{
continue;
}
else
{
int ans = change(s);
G[i][j] = G[j][i] = ans;
}
}
}
Dijkstra();
int ans = 0;
for (int i = 2; i <= N; i++)
{
if (dis[i] > ans)
{
ans = dis[i];
}
}
cout << ans << endl;
return 0;
}
istringstream好用。。