【POJ - 2139】Six Degrees of Cowvin Bacon (Floyd算法求最短路)

Six Degrees of Cowvin Bacon

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;
}
相關文章
相關標籤/搜索