poj2139

牛们最近在拍电影,所以他们准备去玩一个游戏——“六度分割”的变体。
游戏是这样进行的:每个牛离自己的距离是0度,如果两个不同的牛同时出现在一个电影里,那么他们之间的距离为1度,如果两只牛从未一起工作,但它们都与第三只牛一起工作,那么他们之间的距离为2度。
这N(2<=N<=300)头牛对找出那只牛与所有牛之间的平均距离最短感兴趣。当然,不算上他自己。这些牛拍了M(1<=M<=10000)部电影,并且保证每两个牛之间都有一定的关系。

原题地址:http://poj.org/problem?id=2139

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int mapa[500][500];
int m,n;
int q[500];
int inq[500];
int h[500];
int d[500];
int a[500];
int ans=10000000;
int cnt=0;
struct Edge{int u,v,next;}e[5000000];
void spfa(int x){
    memset(q,0,sizeof(q));
    memset(inq,0,sizeof(inq));
    memset(d,127,sizeof(d));
    d[x]=0;
    q[0]=x;
    inq[x]=1;
    int head=0,tail=1;
    while(head!=tail){
        int u=q[head++%400];
        inq[u]=0;
        for(int i=h[u];i>0;i=e[i].next){
            int v=e[i].v;
            if(d[u]+1<d[v]){
                d[v]=d[u]+1;
                if(!inq[v]){
                    inq[v]=1;
                    q[tail++%400]=v;
                }
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x;
        cin>>x;
        memset(a,0,sizeof(a));
        for(int j=1;j<=x;j++){
            scanf("%d",&a[j]);
        }
        for(int j=1;j<=x;j++){
            for(int k=1;k<=x;k++){
                mapa[a[j]][a[k]]=mapa[a[k]][a[j]]=1;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(mapa[i][j]){
                e[++cnt]=(Edge){i,j,h[i]};h[i]=cnt;
            }
        }
    }
    for(int i=1;i<=n;i++){
        spfa(i);
        int sum=0;
        for(int j=1;j<=n;j++){
            sum+=d[j];
        }
        ans=min(ans,sum);//    cout<<sum<<endl;
    }
    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<mapa[i][j]<<"  "<<endl;
            }
            cout<<endl;
        }*/
    cout<<ans*100/(n-1)<<endl;
    return 0;
} 
时间: 2025-01-05 10:43:55

poj2139的相关文章

【Floyd】POJ2139 -Six Degrees of Cowvin Bacon

普通的Floyd了分分秒可以水过,结果在submit前删调试段落的时候把程序本体给删了吃了两个WA…… 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 const int INF=3000000; 5 using namespace std; 6 const int MAXN=10000; 7 int len[MAXN][MAXN]; 8 int f[MAXN][MAXN]; 9 10 int

POJ2139 Six Degrees of Cowvin Bacon [Floyd]

水题,随手敲过 一看就是最短路问题,a,b演同一场电影则他们的距离为1 默认全部两两原始距离无穷,到自身为0 输入全部数据处理后floyd 然后照它说的求平均分离度 再找最小的,×100取整输出 #include <cstdio> #include <algorithm> #include <iostream> using namespace std; int cownum,filmnum; int film[11111][333]; int g[333][333];

Six Degrees of Cowvin Bacon.(POJ-2139)

一道简单的图论题,不过穿上了很好的外衣,实质就是一个任意两点间最短路问题,比较适合用Floyd算法 #include<cstdio> #include<iostream> using namespace std; const int INF = 100000; int n,m,t,d[305][305],a[305]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(i

POJ2139 Six Degrees of Cowvin Bacon 【Floyd】

Six Degrees of Cowvin Bacon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3131   Accepted: 1455 Description The cows have been making movies lately, so they are ready to play a variant of the famous game "Six Degrees of Kevin Bacon&quo