PS:楼主月赛由于没有看清楚N的含义,把多组数据测试看成了一组数据,悲剧WR好多次,比赛完才反应过来,到手的六分木有了。。T^T。
题目描述 : 一个人要做公交车去一个地方,告诉你很多种公交的路线,再告诉你起点位置跟终点位置,让你求最短时间。到达不了输出-1。很显然,最短路问题,话不多说Dijkstra上。
#include <cstdio>
#include <cstring>
const int MAXCOST = 99999;
const int Gmax = 155;
const int Nmax = 35;
using namespace std;
typedef struct
{
char name[Nmax];
}node;
int key; //用于记录每次图顶点的个数。
int main()
{
int judge(char s[],node station[]);
void Dijkstra(int f,int Graph[][Gmax],int Distance[Gmax]);
int time,y,x,f;
node station[10010]; //将站牌名字转换为数字。
int Graph[155][155];
int Distance[155];
int n,u;
while(scanf("%d",&n) && n != -1) //n表示下面公交有多少,数据有多组,n=-1,表示退出。
{
char start[Nmax],end[Nmax]; //第一次输入表示起点跟终点。
scanf("%s %s",start,end);
strcpy(station[0].name,start); //起点默认为0。
key = 1;
judge(end,station); //judge生成站牌名字对应的数字,
memset(Graph,0x3f,sizeof(Graph));
f=judge(end,station); //记录end的数字。用于dijkstra输出起点到终点的最短路径。
while(n--)
{
scanf("%s",start);
scanf("%s",end);
scanf("%d",&time);
x=judge(start,station); //将站牌转化为数字。
y=judge(end,station);
Graph[x][y] = time; //双向问题
Graph[y][x] = time;
}
for(int i = 0 ; i<key; i++) //图邻接矩阵的的对角线为零。
{
Graph[i][i] = 0;
}
Dijkstra(f,Graph,Distance);
}
return 0;
}
int judge(char s[],node station[]) // 将站牌转化为对应的数字。
{
for(int i = 0 ; i < key ; i++)
{
if(strcmp(station[i].name,s) == 0)
{
return i;
}
}
strcpy(station[key].name,s);
return key++;
}
void Dijkstra(int f,int Graph[][Gmax],int Distance[Gmax]) //dijkstra算法求最短路径
{
int s[Gmax];
int mindis,dis;
int i,j,u;
for(i=0;i<key;i++) //对S数组初始化。
{
Distance[i]=Graph[0][i];
s[i]=0;
}
s[0]=1; //标记v0.
for(i=0;i<key;i++)
{
mindis=MAXCOST;
for(j=0;j<key;j++)
{
if(s[j]==0 && Distance[j]<mindis) //每一次循环比较得到最短值。
{
u=j;
mindis=Distance[j];
}
}
s[u]=1; //标记u.
for(j=0;j<key;j++)
{
if(s[j]==0)
{
dis=Distance[u]+Graph[u][j];
Distance[j]=(Distance[j]<dis)?Distance[j]: dis; //修改从v0到其他顶点的最短距离。
}
}
}
if(Distance[f]== 0x3f3f3f3f) //表示到达不了终点,即找不到最短路。
{
printf("-1\n");
}
else
{
printf("%d\n",Distance[f]);
}
}