最短路径题,题意简洁,思路清晰,不过WA了N次。
(1)许多细节没处理好。
(2)字符串的处理不到位,后来是看了别人的解题报告才用的map过的。
(3)可能存在起点与终点相同的情况,而且不能直接输出0,必须用标记,因为可能数据还没处理完。
CODE:
#include<stdio.h>
#include<map> //map容器
#include<stdlib.h>
#include<string.h>
using namespace std;
#define INF 0x3f3f3f3f
const int SIZE = 155;
int w[SIZE][SIZE];
int v[SIZE], d[SIZE];
char beg[SIZE], end[SIZE];
int flag;
int Dijsktra(int s, int n)
{
int i, j;
for(i = 1; i <= n; i++) d[i] = (i == s)? 0:INF;
for(i = 1; i <= n; i++)
{
int x, m = INF;
for(int y = 1; y <= n; y++) if(!v[y] && d[y] < m) m = d[x=y];
v[x] = 1;
if(m == INF) break;
for(int y = 1; y <= n; y++) d[y] <?= d[x] + w[x][y];
}
}
void init()
{
memeset(w, INF, sizeof(w));
memset(v, 0, sizeof(v));
memset(d, 0, sizeof(d));
flag = 0;
}
int main()
{
int cnt, n;
map<string, int> my_map; //map容器的定义
while(~scanf("%d", &n), n != -1)
{
init();
my_map.clear();
scanf("%s%s", beg, end);
if(!strcmp(beg, end)) flag = 1; //若直接printf("0\n");可能报错,可能是因为数据没输完。
my_map[beg] = 1;
my_map[end] = 2;
cnt = 3; //cnt的处理
while(n--)
{
char sz1[SIZE], sz2[SIZE];
int dis;
scanf("%s%s%d", sz1, sz2, &dis);
if(!my_map[sz1]) my_map[sz1] = cnt++;
if(!my_map[sz2]) my_map[sz2] = cnt++;
if(w[my_map[sz1]][my_map[sz2]] > dis)
{
w[my_map[sz1]][my_map[sz2]] = w[my_map[sz2]][my_map[sz1]] = dis;
}
}
if(flag)
{
printf("0\n");
continue;
}
Dijsktra(1, cnt);
if(d[2] == INF) printf("-1\n");
else printf("%d\n", d[2]);
}
return 0;
}
#include<map> //map容器
#include<stdlib.h>
#include<string.h>
using namespace std;
#define INF 0x3f3f3f3f
const int SIZE = 155;
int w[SIZE][SIZE];
int v[SIZE], d[SIZE];
char beg[SIZE], end[SIZE];
int flag;
int Dijsktra(int s, int n)
{
int i, j;
for(i = 1; i <= n; i++) d[i] = (i == s)? 0:INF;
for(i = 1; i <= n; i++)
{
int x, m = INF;
for(int y = 1; y <= n; y++) if(!v[y] && d[y] < m) m = d[x=y];
v[x] = 1;
if(m == INF) break;
for(int y = 1; y <= n; y++) d[y] <?= d[x] + w[x][y];
}
}
void init()
{
memeset(w, INF, sizeof(w));
memset(v, 0, sizeof(v));
memset(d, 0, sizeof(d));
flag = 0;
}
int main()
{
int cnt, n;
map<string, int> my_map; //map容器的定义
while(~scanf("%d", &n), n != -1)
{
init();
my_map.clear();
scanf("%s%s", beg, end);
if(!strcmp(beg, end)) flag = 1; //若直接printf("0\n");可能报错,可能是因为数据没输完。
my_map[beg] = 1;
my_map[end] = 2;
cnt = 3; //cnt的处理
while(n--)
{
char sz1[SIZE], sz2[SIZE];
int dis;
scanf("%s%s%d", sz1, sz2, &dis);
if(!my_map[sz1]) my_map[sz1] = cnt++;
if(!my_map[sz2]) my_map[sz2] = cnt++;
if(w[my_map[sz1]][my_map[sz2]] > dis)
{
w[my_map[sz1]][my_map[sz2]] = w[my_map[sz2]][my_map[sz1]] = dis;
}
}
if(flag)
{
printf("0\n");
continue;
}
Dijsktra(1, cnt);
if(d[2] == INF) printf("-1\n");
else printf("%d\n", d[2]);
}
return 0;
}