Descriptionshtml
数学课上,WNJXYK突然发现人缘也是能够被量化的,咱们用一我的到其余全部人的平均距离来量化计算。ios
在这里定义人与人的距离:
1.本身与本身的距离为0
2.若是A和B属于同一个小团体,那么他们之间的距离为1
3.若是A与B属于一个小团体,B与C属于一个小团体,且A与C不一样属于任何一个小团体,那么A与C的距离为2(A联系C,通过B、C两我的)
4.以此类推算法
班里有N我的 (2 <= N <= 300),共有M对小团体关系(1 <= M <= 10000)。如今,给你全部班级中小团体的信息,问你班里人缘最好的人到其余人的平均距离。(你须要输出平均距离的100倍)spa
Input.net
第一行输入两个证书N,M
接下来的M+1行,每行开头一个整数K表示本小团体大小,而后接下来K个整数表示小团体内学生编号。code
Outputhtm
输出一行:最小的平均距离*100(程序中请不要使用Float和Double计算,可能会判Wa)blog
Sample Inputip
4 2
3 1 2 3
2 3 4ci
Sample Output
100
题目连接
https://vjudge.net/problem/POJ-2139
最短路问题,把一个团体的人当作相邻的点,之间的距离为1,再用Floyd算法求出每两我的之间的距离便可
Floyd算法详解 http://www.javashuo.com/article/p-frhnbgsz-kd.html
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string>1 #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define IOS ios_base::sync_with_stdio(0); cin.tie(0) #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 300+5 #define P pair<int,int> using namespace std; int n,m,x; int d[Maxn][Maxn]; void init() { //i到j的距离,初始化为无穷大 for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(i==j)//本身 d[i][j]=d[j][i]=0; else d[i][j]=d[j][i]=INF; } } int main() { cin>>n>>m; init();//初始化 while(m--) { cin>>x; int b[Maxn];//暂时存一下人 for(int i=0; i<x; i++) cin>>b[i]; for(int i=0; i<x-1; i++)//每两我的之间的距离为1 for(int j=i+1; j<x; j++) d[b[i]][b[j]]=d[b[j]][b[i]]=1; } //Floyd算法求最短路 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]); int ans=INF; for(int i=1; i<=n; i++)//枚举每一个人 { int sum=0; for(int j=1; j<=n; j++) sum+=d[i][j]; ans=min(ans,100*sum/(n-1)); } cout<<ans<<endl; return 0; }