51nod 1366 贫富差距

来源:互联网 发布:智能手机上制作软件 编辑:程序博客网 时间:2024/05/14 23:13

先用并查集判断所有节点是否在同一集合内。如果不是,输出-1。

然后求图中最远两点的距离即可。

#include<bits/stdc++.h>using namespace std;const int N=55;int n,fa[N],vis[N];char mz[N][N];int findfa(int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);}int bfs(int x){int tmp,i,step;memset(vis,0,sizeof(vis));queue<int> q;q.push(x);vis[x]++;while(!q.empty()){tmp=q.front();q.pop();x=tmp%100;step=tmp/100;for(i=1;i<=n;i++){if(mz[x][i]=='Y'&&!vis[i]){q.push((step+1)*100+i);vis[i]++;}}}return tmp/100;}int main(){int T,i,j,ans,d;cin>>T;while(T--){scanf("%d%d",&n,&d);for(i=1;i<=n;i++)fa[i]=i;for(i=1;i<=n;i++)for(j=1;j<=n;j++){scanf(" %c",&mz[i][j]);if(mz[i][j]=='Y')fa[findfa(i)]=findfa(j);}for(i=2;i<=n;i++){if(findfa(i)!=findfa(1))break;}if(i<=n){printf("-1\n");continue;}ans=0;for(i=1;i<=n;i++)ans=max(ans,bfs(i));printf("%d\n",ans*d);}}


0 0
原创粉丝点击