题目简单
邻接矩阵+dijkstra
#include<stdio.h>
#include<iostream>
#include<memory.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
const int MAX_N=101;
int r[MAX_N][MAX_N];
int have[MAX_N];
int d[MAX_N][MAX_N];
int N;
int M;
int init()
{
scanf("%d",&N);
int i,j;int d;
for (i=1;i<=N;i++)
for (j=1;j<=N;j++)
{
scanf("%d",&d);
r[i][j]=d;
r[j][i]=d;
}
}
int putD()
{
int i;int j;
for(i=1;i<=N;i++){
for(j=1;j<=N;j++)
printf("%d ",d[i][j]);
printf("\n");}
}
int DijkStra()
{
int i,j,k,t;
for (t=1;t<=N;t++)
{
memset(d[t],1,sizeof(d[t]));
d[t][t]=0;
//putD();
memset(have,0,sizeof(have));
for (i=1;i<=N;i++)
{
int j=1;
while (have[j]&&j<=N) j++;
if (j>N) break;
for (k=j+1;k<=N;k++)
if (!have[k]&&d[t][k]<d[t][j]) j=k;
have[j]=1;
for (k=1;k<=N;k++)
if (!have[k]&&d[t][j]+r[j][k]<d[t][k])
d[t][k]=d[t][j]+r[j][k];
}
}
}
int put()
{
scanf("%d",&M);
int i;
int s,t;
for (i=1;i<=M;i++)
{
scanf("%d %d",&s,&t);
printf("%d\n",d[s][t]);
}
}
int main()
{
init();
DijkStra();
put();
return 0;
}