OJ P1205 田地上的环(邻接矩阵/DFS)

“佛洛依德”(音译)。?

Code:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=300;//据题目要求最大250*250,多开到300;
bool mapp[maxn][maxn]={false};//建立邻接矩阵,赋初值为假;
bool aaa[256]={0};//再建立一个布尔数组存储每个点与点【1】的连通关系;
int n,m;
void read()
{
 
 int x,y;
 for(int i=1;i<=m;i++)
 {
  cin>>x>>y;
  mapp[x][y]=true;mapp[y][x]=true;
 }
}
void work()
{  
 
 int k=1;aaa[k]=1;mapp[1][1]=true;
 

for(int i=1;i<=n;i++) mapp[i][i]=true; //对角线(左上到右下)赋值为true,表示每个点与自己连通;
 
【 for (int k=1;k<=n;k++)
  for(int i=1;i<=n;i++)
   for(int j=1;j<=n;j++)
    if(mapp[i][j]=mapp[i][j]  ||  (mapp[i][k]&&mapp[k][j]))
     mapp[i][j]=true;】//三重循环判断每两个点是否直接连通或间接(隔点)连通,是就赋值true;
    
 
 int s=0;//用s变量进行特判;
 for(int i=1;i<=n;i++)
   if (mapp[1][i]==0)  cout<<i<<endl; //普通输出;
   else s++;
 if(n-s==0) cout<<'0'<<endl;//当全部点与【1】点连通输出'0';
 

int main()
{
 cin>>n>>m;
 ds();
 work(); 

 return 0;

}
中午加注释。搞定。。


 

--------------------------------------------------下面该是bfs P1205------------------------------------

没改 。。马上。


好吧。深搜是dfs。。。吃完饭写注释。。

code:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=300;
bool mapp[maxn][maxn]={false};
bool aaa[256]={0};
int n,m,j;
void read()
{
 
 int x,y;
 for(int i=1;i<=m;i++)
 {
  cin>>x>>y;//读数
  mapp[x][y]=true;mapp[y][x]=true;//双向连通
 }
}
 

 

void dfs(int k)//深搜
{
 aaa[k]=true;
 for(int i=1;i<=n;i++)
  if((!aaa[i])&&(mapp[k][i]))
   dfs(i);

}//挺麻烦,感觉现在懂了,但无法叙述,更不会熟练运用。【!】

 

 


int main()
{
 cin>>n>>m;
 read();
 dfs(1);
    int s=0;
 for(int i=1;i<=n;i++)
   if (aaa[i]==0)  cout<<i<<endl; 
   else s++;
 if(n-s==0) cout<<'0'<<endl;
 
 

 return 0;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值