这个点的个数不是最大的编号,而是输入中真实的点的个数
比简单的floyd的题目
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 110; const int INF = 100000000; int g[N][N], a, b, id, sum, n[N], num; int main() { int icase = 1; while ( scanf("%d%d", &a, &b ) != EOF && !(!a && !b ) ) { id = 0, sum = 0, num = 0; memset( n, 0, sizeof(n) ); for ( int i = 0; i < N; ++i ) for ( int j = i; j < N; ++j ) g[i][j] = g[j][i] = INF; id = max( id, max(a, b)); g[a][b] = 1; if ( !n[a] ) num++, n[a] = 1; if ( !n[b] ) num++, n[b] = 1; while ( scanf("%d%d", &a, &b) && !(!a&&!b)) { g[a][b] = 1, id = max( id, max( a, b ) ); if ( !n[a] ) n[a] = 1, num++; if ( !n[b] ) n[b] = 1, num++; } for ( int k = 1; k <= id; ++k ) for ( int i = 1; i <= id; ++i ) for ( int j = 1; j <= id; ++j ) if ( i != j && j != k && k != i && g[i][k] + g[k][j] < g[i][j] ) g[i][j] = g[i][k] + g[k][j]; for ( int i = 1; i <= id; ++i ) for ( int j = 1; j <= id; ++j ) if ( g[i][j] < INF ) sum += g[i][j]; num *= ( num-1 ); //printf("%d %d\n", sum, num); printf("Case %d: average length between pages = %.3lf clicks\n", icase++, sum/(double)num); } }