51Nod 1366 贫富差距

来源:互联网 发布:tv软件市场 编辑:程序博客网 时间:2024/06/09 00:28

1366 贫富差距

题目来源: TopCoder
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
一个国家有N个公民,标记为0,1,2,…,N-1,每个公民有一个存款额。已知每个公民有一些朋友,同时国家有一条规定朋友间的存款额之差不能大于d。也就是说,a和b是朋友的话,a有x元的存款,b有y元,那么|x-y|<=d。给定d值与N个人的朋友关系,求这个国家最富有的人和最贫穷的人的存款相差最大的可能值是多少?即求贫富差距的最大值的下界。若这个值为无穷大,输出-1.
Input
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5
每组测试数据有相同的结构构成。
每组数据的第一行两个整数N,d,表示人数与朋友间存款差的最大值,其中2<=N<=50,0<=d<=1000.
接下来有一个N*N的数组A,若A[i][j]=’Y’表示i与j两个人是朋友,否则A[i][j]=’N’表示不是朋友。其中A[i][i]=’N’,且保证
A[i][j]=A[j][i].
Output
每组数据一行输出,即这个国家的贫富差距最大值的下界,如果这个值为无穷大输出-1.
Input示例
3
3 10
NYN
YNY
NYN
2 1
NN
NN
6 1000
NNYNNN
NNYNNN
YYNYNN
NNYNYY
NNNYNN
NNNYNN
Output示例
20
-1
3000

分析:Flyod 找两点之间的最大距离,乘以d,无限大的情况肯定是联通块的数目大于 1

//并查集判断+Flyod#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<algorithm>#define MAXN 55using namespace std;int fa[MAXN],n,d;char map[MAXN][MAXN];inline void read(int &x) {    x = 0; register char c = getchar();    while(c > '9' || c < '0') c = getchar();    while(c >= '0' && c <= '9') { x = x *10 + c - '0'; c = getchar(); }}struct Node { int idex,step; }Now,Nos;bool exist[MAXN];int Find(int x) {    if( x == fa[x] ) return x;    else return fa[x] = Find(fa[x]);}int Bfs(int x) {    queue<Node> q;    memset(exist,0,sizeof exist );    exist[x] = true;    Now.idex = x,Now.step = 0; q.push(Now);    int u,step;    while(!q.empty()) {        Nos = q.front();q.pop();        u = Nos.idex,step = Nos.step;        for(int i=1; i<=n; ++i)             if(map[u][i] == 'Y' & !exist[i]){                exist[i] = true;                Now.idex = i,Now.step = step + 1;                q.push(Now);            }    }    return step;}int main(int argc,char *argv[]) {    int T; read(T);    while( T-- ) {        read(n),read(d);        for(int i=1; i<=n; ++i) scanf("%s",map[i] + 1),fa[i] = i;        for(int i=1; i<=n; ++i)            for(int j=i+1; j<=n; ++j)                if(map[i][j] == 'Y') fa[Find(i)] = Find(j);        int s = 0;        for(int i=1; i<=n; ++i) if(fa[i] == i) s++;        if(s > 1) { printf("-1\n"); continue; }        int p,Ans = 0;        for(int i=1; i<=n; ++i)            Ans = max(Ans,Bfs(i));        printf("%d\n",d * Ans);    }    return 0;}
原创粉丝点击