zoukankan      html  css  js  c++  java
  • 搜索

    1.DFS

    AcWing 165. 小猫爬山

    挺经典的DFS;
    题目

    #include<bits/stdc++.h>
    using namespace std;
    inline long long read(){
        long long num=0;int z=1;char c=getchar();
        if(c=='-') z=-1;
        while((c<'0'||c>'9')&&c!='-') c=getchar();
        if(c=='-') z=-1,c=getchar();
        while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
        return z*num;
    }
    int n,w,ans,a,p,q;
    int c[30],cab[30];
    void dfs(int now,int cnt)
    {
     	if(cnt>ans)return ;
     	if(now==n+1)
     	{
     		ans=min(ans,cnt);return ;//边界
    		
     	}
    	for(int i=1;i<=cnt;i++)//逐一挑选车
    	{
    		if(cab[i]+c[now]<=w)
    		{
    			cab[i]+=c[now];
    			dfs(now+1,cnt);
    			
    			cab[i]-=c[now];//注意还原
    		}
    	}
    	cab[cnt+1]=c[now];//自辟一个
    	dfs(now+1,cnt+1);
    	cab[cnt+1]=0;
    }
    
    int main()
    {
    	n=read(),w=read();
    	ans=n;
    	for(int i=1;i<=n;i++)	
    	{
    		c[i]=read();
    	}
    	sort(c+1,c+n+1);reverse(c+1,c+n+1);
    	dfs(1,0);
    
    	cout<<ans;
    }
    

    164. 可达性统计

    难一些

    #include<bits/stdc++.h>
    using namespace std;
    inline long long read(){
        long long num=0;int z=1;char c=getchar();
        if(c=='-') z=-1;
        while((c<'0'||c>'9')&&c!='-') c=getchar();
        if(c=='-') z=-1,c=getchar();
        while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
        return z*num;
    }
    const int M=30006;
    int m,n,tot,k,head[M],deg[M],d[M];
    queue<int>q;
    bitset<M>f[M];
    struct edge{
    	int next,v;
    }e[M];
    void add(int x,int y)
    {
    	tot++; e[tot].v=y ;e[tot].next=head[x]; head[x]=tot;
    }
    
    
    void topsort()//拓扑
    {
    	for(int i=1;i<=n;i++)
    	{
    		if(!d[i])q.push(i);
    	}
    	while(q.size())
    	{
    		int x=q.front();
    		q.pop();
    		deg[++k]=x;
    		for(int i=head[x];i;i=e[i].next)
    		{
    			int y=e[i].v;
    			if(--d[y]==0)q.push(y);
    		}
    	}
    }
    int main()
    {
    	n=read(),m=read();
    	for(int i=1;i<=m;i++)
    	{
    		int x=read(),y=read();
    		add(x,y);
    		d[y]++;
    	}
    
    	topsort();//确定拓扑序
    	
    	for(int i=n;i>=1;i--)//到这来,因为前面的要累加后面的
    	{
    		int j=deg[i];
    		f[j][j]=1;//自己能到自己
    		for(int k=head[j];k;k=e[k].next)
    		{
    			int y=e[k].v;
    			f[j]|=f[y];//二进制压缩,将能到的点压成二进制
    		}
    	}
    	for(int i=1;i<=n;i++)cout<<f[i].count()<<endl;//数二进制中1个数函数
    }
    

    BFS

    其实差不多

    奇怪的电梯

    BFS主要用于规模加快很快的

    #include<bits/stdc++.h>
    using namespace std;
    int n,a,b;
    int p[300],d[300],vis[300];
    void BFS()
    {
    	queue<int>s;
    	s.push(a);
    	d[a]=0;
    	vis[a]=1;
    	while(!s.empty())
    	{
    		int now=s.front();
    		s.pop();
    		if(now==b)
    		{
    			break;
    		}
    		if((now+p[now])<=n&&vis[now+p[now]]==0)//可向上
    		{
    			d[now+p[now]]=d[now]+1;
    			vis[now+p[now]]=1;
    			s.push(now+p[now]);	
    		}
    		if((now-p[now])>0&&vis[now-p[now]]==0)//可向下
    		{
    			d[now-p[now]]=d[now]+1;
    			vis[now-p[now]]=1;
    			s.push(now-p[now]);	
    		}
    	}
    }
    int main()
    {
    	cin>>n>>a>>b;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>p[i];
    	}
    	memset(d,0x3f,sizeof(d));
    	BFS();
    	if(d[b]==0x3f3f3f3f)//到不了
    	{
    		cout<<"-1";
    	}
    	else cout<<d[b];
    	
     	return 0;
    }
    

    还有一些好题,因不符要求不是板子不再写
    在这里插入图片描述

  • 相关阅读:
    从索罗斯的“暴涨-暴跌”模型,看“房地产泡沫”
    在深圳有娃的家长必须要懂的社保少儿医保,不然亏大了!(收藏)
    深圳楼市2007vs2016
    细论庚金
    Win10无法安装提示磁盘布局不受UEFI固件支持怎样解决
    八字庚金特性
    广东省限价房转让需补70%的溢价
    DBUTIL 调用存储过程例子
    第二届八一杯网络大学生数学竞赛试题
    八一的专属上网导航服务
  • 原文地址:https://www.cnblogs.com/ruanmowen/p/13758339.html
Copyright © 2011-2022 走看看