题意:给一个图,图中所有边权值都为1,求任意两个顶点间的最短路。
思路:Floyd算法求最短路。其实用邻接矩阵存图的话,可以直接在矩阵上DP哦~
发现我还是有长进的,以前照着模板敲半天没敲出来,现在自己敲一下就好了。。。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <ctype.h>
using namespace std;
int ans[21][21];
int n,m;
int main(){
int count=0;
while(cin>>n){
count++;
for(int i=1;i<21;i++){
for(int j=1;j<21;j++){
if(i==j){
ans[i][j]=0;
}else{
ans[i][j]=1000;
}
}
}
//input
for(int i=1;i<=19;i++){
for(int j=0;j<n;j++){
cin>>m;
ans[i][m]=ans[m][i]=1;
}
if(i!=19){
cin>>n;
}
}
//
for(int k=1;k<=20;k++){//中间点
for(int i=1;i<=20;i++){//端点1
for(int j=1;j<=20;j++){//端点2
if( (ans[i][k]+ans[k][j]) < ans[i][j] ){
ans[i][j]=ans[j][i]=(ans[i][k]+ans[k][j]);
}
}
}
}
printf("Test Set #%d\n",count);
int N;cin>>N;
for(int i=0;i<N;i++){
int u,v;
cin>>u>>v;
printf("%2d to %2d: %d\n",u,v,ans[u][v]);
}
cout<<endl;
}
return 0;
}