I really want to hit the computer !!!! Tle, WA, re, re, and countless re, re !!! Re, your sister! Define the string outside the while () field, and define it inside re, And the char type can pass, and the string is TLE. Is it so cool !!! A total of more than 30 times have been added !!!! Crash !!!!!!
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
const int N = 108;
const int inf = 0x3fffffff;
map<string, int> m;
int dis[N][N];
int low[N];
bool vis[N];
void Dijkstra(int n, int v, int e)
{
int flag, i, j, min;
for(i = 1;i <= n; i++)
{
low[i] = dis[v][i];
vis[i] = false;
}
vis[v] = true;
low[v] = 0;
for(i = 2; i <= n; i++)
{
min = inf; flag = v;
for(j = 1; j <= n; j++)
{
if(!vis[j] && min > low[j])
{
min = low[j];
flag = j;
}
}
vis[flag] = true;
for(j = 1; j <= n; j++)
{
if(!vis[j] && dis[flag][j] + low[flag] < low[j])
low[j] = dis[flag][j] + low[flag];
}
}
if(low[e] != inf)
printf("%d\n", low[e]);
else
printf("-1\n");
}
int main()
{
//freopen("data.in", "r", stdin);
int n, num, i, j, x;
char s1[55], s2[55];
char begin[55], end[55];
while(scanf("%d", &n) != EOF)
{
if(n == -1) break;
scanf("%s %s", begin, end);
num = 1;
if(!m[begin])
m[begin] = num++;
if(!m[end])
m[end] = num++;
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
if(i == j)
dis[i][j] = 0;
else
dis[i][j] = inf;
for(i = 1; i <= n; i++)
{
scanf("%s %s %d", s1, s2, &x);
if(!m[s1])
m[s1] = num++;
if(!m[s2])
m[s2] = num++;
dis[m[s1]][m[s2]] = dis[m[s2]][m[s1]] = x;
}
Dijkstra(num-1, m[begin], m[end]);
//cout << m[begin] << " " << m[end] << endl;
m.clear();
}
return 0;
}