【最小生成树】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;
}

..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh
浙公网安备 33010602011771号