【最小生成树】mty的宝藏

题目:mty的宝藏 rqnoj564

题目描述

mty历尽千辛万苦终于打败了那个家伙。mty很猥琐,搜刮那人身上的东西,结果搜到了一张藏宝地图。地图描述了一个地下室。地下室有n个仓库,仓库之间有几条线路,通过这些线路,mty可以从一个仓库到另以个仓库。但这些线路是单向的。mty很容易迷路,这个地下室一旦有了环,他就会迷路。他想知道这个地下室里面有没有环!

输入格式

第一行,n表示有n个仓库。
接下来n行,每行n个数(0或1)第i+1行第j个数为1表示可以从i走到j。(但不代表可以从j走到i);

输出格式

一行,'Y' 或 'N','Y'表示有回路,‘N'表示没有

样例输入

样例输出

 

看到这一题很容易想到看能否进行拓扑排序,能则输出Y,否则输出N

不过最后还是决定用最小生成树来写。。。只需判断和总路程是否相等即可

C++ Code

#include<cstdio>
#define MAXN 1000+10
#define oo 99999999

int n,map[MAXN][MAXN],dist[MAXN];
bool h[MAXN];

int main()
{
  freopen("rqn564.in","r",stdin);
  freopen("rqn564.out","w",stdout);
  scanf("%d",&n);
  int i,j,max=0;
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
      scanf("%d",&map[i][j]);
      max+=map[i][j];
    }
  for(i=1;i<=n;i++)dist[i]=oo;
  dist[1]=0;
  int k,min,sum=0;
  for(i=1;i<=n;i++)
  {
    k=0;min=oo;
    for(j=1;j<=n;j++)
      if(!h[j] && min>dist[j]){min=dist[j];k=j;}
    if(min==oo){sum=-1;break;}
    h[k]=true;
    sum+=dist[k];
    for(j=1;j<=n;j++)
      if(!h[j] && map[k][j]!=0 && dist[j]>map[k][j]) dist[j]=map[k][j];
  }
  if(sum==max) printf("N");
  else printf("Y");
  return 0;
}

 

 

posted @ 2012-08-18 20:50  jiangzh  阅读(251)  评论(0)    收藏  举报