这个地杰斯特拉的标记路径比BFS的简单多了,个人感觉,这道题目就是输出以及输入非常蛋疼,输出非常容易PE;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define INF 100000000
using namespace std;
int judge[25];
int target[25];//标记消防局;
int step[105];//记录路径;
int cost[25][25];//记录节点与节点之间的距离;
int n,dis[25];//记录从火灾地点到点I的最短路径;
int fire,num;//火灾路口以及消防局的数量
int yes=0;
void output()//输出。
{
if(yes!=0) printf("\n");//这个地方搞得我PE了N次,就是在只有一组数据的时候不用空行;
printf( "Org\tDest\tTime\tPath\n");
//printf("%d\n",num);
while(num--)
{
//printf("yes\n");
int minstep=INF;
int t;
for(int i=1;i<=n;i++)//找出离火灾最近的消防局。
{
if(target[i]==1&&minstep>dis[i])
{
minstep=dis[i];
t=i;
}
}
//printf("sss%d\n",t);
target[t]=0;//千万要记住要把已经输出的消防队标记为0;
printf("%d\t%d\t%d",t,fire,dis[t]);
//printf("yes\n");
while(1)
{
printf("\t%d",t);
t=step[t];
if(t==-1) break;
}
printf("\n");
}
//printf("\n");
yes=1;
return;
}
void solution(int point)//标准的地杰斯特拉,没什么好说的.
{
for(int i=1;i<=n;i++) dis[i]=INF;
memset(judge,0,sizeof(judge));
memset(step,-1,sizeof(step));
dis[point]=0;
//judge[point]=1;
int x;
while(1)
{
x=-1;
for(int i=1;i<=n;i++)
{
if(judge[i]==0&&(x==-1||dis[i]<dis[x])) x=i;
}
if(x==-1) break;
judge[x]=1;
for(int i=1;i<=n;i++)
{
if(judge[i]==0&&dis[i]>dis[x]+cost[x][i])
{
step[i]=x;
dis[i]=dis[x]+cost[x][i];
}
}
}
//printf("yes\n");
//printf("%d %d %d \n",dis[4],dis[5],dis[6]);
output();
}
int main()
{
int t;
char ch,x[10000];
//scanf("%d",&t);
//while(t--)
// {
scanf("%d",&n);
memset(cost,0,sizeof(cost));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&cost[j][i]);
//cost[i][j]=cost[j][i];
if(cost[j][i]==-1)
{
cost[j][i]=INF;
}
}
}
//printf("yes\n");
scanf("%d",&fire);
//printf("%d\n",fire);
getchar();
gets(x);//输入消防队的位置,这个地方蛮蛋疼的;
num=0;
memset(target,0,sizeof(target));
int len=strlen(x);
int tmp=0;
for(int i=0;i<=len;i++)
{
if('0'<=x[i]&&x[i]<='9')
{
num++;
target[x[i]-'0']=1;
}
}
/*for(int i=1;i<=n;i++)
{
if(target[i]==1) printf("%d\n",i);
}*/
//printf("yes\n");
solution(fire);
// }
return 0;
}
//最后提醒 所有的数组都要考虑归零!!!!