POJ 2139 Six Degrees of Cowvin Bacon

来源:互联网 发布:windows商店应用内购 编辑:程序博客网 时间:2024/06/11 12:44

原题链接

思路:floyd,任意两点最短距离。

AC代码:

#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <cstring>#include <cmath>#include <vector>#include <queue>using namespace std;//思路:图论,最短路径问题。将牛当作点,将在同一处工作的牛连起来,权值为1。 int N,M,cow[305],dis[305][305],a[305];int min(int m,int n){    return m < n ? m : n;}void floyd(){    int i,j,k;    for(i = 1; i <= N; i++){        for(j = i + 1; j <= N; j++){            for(k = 1; k <= N; k++){                dis[i][j] = dis[j][i] = min(dis[i][j],dis[i][k] + dis[k][j]);            }        }     }}int main(){    int i,j,k;    scanf("%d %d",&N,&M);    for(i = 1; i <= N; i++){        for(j = 1; j <= N; j++){            if(i == j)  dis[i][j] = 0;            else  dis[i][j] = 1000000;        }    }    for(i = 1; i <= M; i++){        int num;        scanf("%d",&num);        for(j = 1; j <= num; j++){            scanf("%d",&a[j]);        }        for(j = 1; j <= num; j++){            for(k = j + 1; k <= num; k++){                dis[a[j]][a[k]] = dis[a[k]][a[j]] = 1;            }        }    }    floyd();    int ans = 1000000;    for(i = 1; i <= N; i++){        int sum = 0;        for(j = 1; j <= N; j++){            sum += dis[i][j];        }        ans = min(sum,ans);    }    printf("%d\n",ans*100/(N-1));    return 0;}
1 0
原创粉丝点击