Six Degrees of Cowvin Bacon POJ—2139

                             

                                    Six Degrees of Cowvin Bacon

The cows have been making movies lately, so they are ready to play a variant of the famous game "Six Degrees of Kevin Bacon". 

 

The game works like this: each cow is considered to be zero degrees of separation (degrees) away from herself. If two distinct cows have been in a movie together, each is considered to be one 'degree' away from the other. If a two cows have never worked together but have both worked with a third cow, they are considered to be two 'degrees' away from each other (counted as: one degree to the cow they've worked with and one more to the other cow). This scales to the general case. 

The N (2 <= N <= 300) cows are interested in figuring out which cow has the smallest average degree of separation from all the other cows. excluding herself of course. The cows have made M (1 <= M <= 10000) movies and it is guaranteed that some relationship path exists between every pair of cows. 

Input

* Line 1: Two space-separated integers: N and M 

* Lines 2..M+1: Each input line contains a set of two or more space-separated integers that describes the cows appearing in a single movie. The first integer is the number of cows participating in the described movie, (e.g., Mi); the subsequent Mi integers tell which cows were. 

Output

* Line 1: A single integer that is 100 times the shortest mean degree of separation of any of the cows. 

Sample Input

4 2
3 1 2 3
2 3 4

Sample Output

100

Hint

[Cow 3 has worked with all the other cows and thus has degrees of separation: 1, 1, and 1 -- a mean of 1.00 .] 

题目大意就是求出每个点到其他每个点的最短距离总和,开始以为是多源最短路问题,想了想还是单源最短路,不过是枚举所有的点而已;

代码如下 (spfa)

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define inf 1e9;

struct node
{
    int to,val;
    node(int _to,int _val){to=_to;val=_val;}
};

vector<node>vec[305];
int dis[305];


int n,m;
int spfa(int s)
{

    int cis[305];
    int vis[305];

    memset(dis,0x3f,sizeof(dis));
    memset(cis,0,sizeof(cis));
    memset(vis,0,sizeof(vis));

    queue<int>que;

    dis[s]=0;
    vis[s]=1;
    cis[s]++;
    que.push(s);

    while (!que.empty())
    {
        int head=que.front();
        que.pop();
        vis[head]=0;

        for(int i=0;i<(int)vec[head].size();i++)
        {   int v=vec[head][i].to;

            if(dis[v]>dis[head]+vec[head][i].val)
            {
                 dis[v]=dis[head]+vec[head][i].val;

                 if(vis[v]==0)
                 {
                     vis[v]=1;
                     que.push(v);
                     cis[v]++;
                     if(cis[v]>n)
                        return 0;

                 }

            }


        }
    }

    return 1;
}
int main()
{


    cin >>n>>m;

    for(int i=1;i<=n;i++)
        vec[i].clear();

    for(int i=0;i<m;i++)
    {   int a,arr[305];

        cin >>a;
        for(int j=0;j<a;j++)
        cin >>arr[j];

        for(int i=0;i<a;i++)
         for(int j=i+1;j<a;j++)
         {
                  vec[arr[i]].push_back(node(arr[j],1));
                  vec[arr[j]].push_back(node(arr[i],1));
         }


    }

    int MAX=inf;


    for(int i=1;i<=n;i++)
    if(spfa(i)==1)
    {
         int sum=0;
      for(int i=1;i<=n;i++)
      {

          sum+=dis[i];

      }

      if(sum<MAX)
        MAX=sum;
    }

    cout <<(MAX*100)/(n-1);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41199502/article/details/81872533
six