题:http://poj.org/problem?id=2139
任意两点之间的最短路径问题:
#include<iostream>
#include<cstdlib>
using namespace std;
const int MAXN=301;
const int INF=99999;
int d[MAXN][MAXN],dis[MAXN],N,M;
void solve()
{
int ans=INF;
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
//cout<<d[i][j]<<endl;
}
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
d[i][0] += d[i][j];
}
//cout<<d[i][0]<<endl;
d[i][0]=100*d[i][0]/(N-1);
ans=min(ans,d[i][0]);
//cout<<ans<<endl;
}
cout<<ans<<endl;
}
int main()
{
while(cin>>N>>M)
{
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++){
d[i][j]=INF;
if(i==j) d[i][j]=0;
}
for(int i=1;i<=M;i++){
int num;
cin>>num;
for(int i=1;i<=num;i++) cin>>dis[i];
for(int i=1;i<=num;i++){
for(int j=i+1;j<=num;j++){
d[dis[i]][dis[j]]=1;
d[dis[j]][dis[i]]=1;
}
}
}
solve();
}
return 0;
}