D3代码AC集

图的邻接矩阵表示

#include<iostream>
#include<iomanip>
#include<cmath> 
#include<string>
#include<algorithm> 
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<stack>
using namespace std;
int n,k,x,y,z,t,sum;
int a[55][55],b[55];
int main(){
	cin>>n>>k;
	for(int i=2;i<=k+1;i++){
	    cin>>x>>y>>z;
      a[x][y]=z;
      a[y][x]=z;
	       
	}
	cin>>t;
	int cnt=0;
	for(int i=1;i<=n;i++){
	    if(a[i][t]!=0){
	        b[++sum]=i;
	        cnt++;
	    }
	}
	for(int i=1;i<=n;i++){
	    for(int j=1;j<=n;j++){
	        cout<<a[i][j]<<" ";
	    }
	    cout<<endl;
	}
	cout<<cnt<<" ";
	for(int i=1;i<=sum;i++){
	    cout<<b[i]<<" ";
	}
	
	return 0;
}

图的邻接矩阵表示2

#include<iostream>
#include<iomanip>
#include<cmath> 
#include<string>
#include<algorithm> 
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<stack>
using namespace std;
int n,k,x,y,z,t,sum;
int a[55][55],b[55];
int main(){
	cin>>n>>k;
	for(int i=2;i<=k+1;i++){
	    cin>>x>>y>>z;
       a[x][y]=z;
	}
	cin>>t;
	int cnt=0;
	for(int i=1;i<=n;i++){
	    if(a[t][i]!=0){
	        b[++sum]=i;
	        cnt++;
	    }
	}
	for(int i=1;i<=n;i++){
	    for(int j=1;j<=n;j++){
	        cout<<a[i][j]<<" ";
	    }
	    cout<<endl;
	}
	cout<<cnt<<" ";
	for(int i=1;i<=sum;i++){
	    cout<<b[i]<<" ";
	}
	return 0;
}

图的邻接矩阵表示3

#include<iostream>
#include<iomanip>
#include<cmath> 
#include<string>
#include<algorithm> 
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<stack>
using namespace std;
int n,k,x,y,z,t,sum,rer;
int a[55][55],b[55],c[55];
int main(){
	cin>>n>>k;
	for(int i=2;i<=k+1;i++){
	    cin>>x>>y>>z;
       a[x][y]=z;
	}
	cin>>t;
	int cnt=0,ans=0;
	for(int i=1;i<=n;i++){
	    if(a[t][i]!=0){
	        b[++sum]=i;
	        cnt++;
	    }
	}
	for(int i=1;i<=n;i++){
	    if(a[i][t]!=0){
	        c[++rer]=i;
	        ans++;
	    }
	}
	for(int i=1;i<=n;i++){
	    for(int j=1;j<=n;j++){
	        cout<<a[i][j]<<" ";
	    }
	    cout<<endl;
	}
	cout<<cnt<<" ";
	sort(b+1,b+sum+1);
	for(int i=sum;i>=1;i--){
	    cout<<b[i]<<" ";
	}
	cout<<endl;
	cout<<ans<<" ";
	sort(c+1,c+rer+1);
	for(int i=rer;i>=1;i--){
	    cout<<c[i]<<" ";
	}
	cout<<endl;
	cout<<ans+cnt;
	return 0;
}

图的前向星表示1

#include<bits/stdc++.h>
using namespace std; 
long long x,y,m,n,head[110000],ver[110000],nxt[110000],tot;
void add(int x,int y){
    tot++;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
int main(){
	cin>>n>>m;
	memset(head,-1,sizeof head);
	for(int i=1;i<=m;i++){
	    cin>>x>>y;
	    add(x,y);
	}
	for(int i=1;i<=n;i++){
	     cout<<i<<":"<<" ";
	    for(int j=head[i];j!=-1;j=nxt[j]){
	        cout<<ver[j]<<" ";
	    }
	    if(head[i]==-1){
	        cout<<"zero";
	    }
	    cout<<endl;
	}
	   
	return 0;
}

图的前向星表示2

#include<bits/stdc++.h>
using namespace std; 
long long x,y,m,n,head[110000],ver[110000],nxt[110000],tot;
void add(int x,int y){
    tot++;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
int main(){
	cin>>n>>m;
	memset(head,-1,sizeof head);
	for(int i=1;i<=m;i++){
	    cin>>x>>y;
	    add(x,y);
	    add(y,x);
	}
	for(int i=1;i<=n;i++){
	     cout<<i<<":"<<" ";
	    for(int j=head[i];j!=-1;j=nxt[j]){
	        cout<<ver[j]<<" ";
	    }
	    if(head[i]==-1){
	        cout<<"zero";
	    }
	    cout<<endl;
	}
	   
	return 0;
}

图的前向星表示3

#include<bits/stdc++.h>
using namespace std; 
long long x,y,m,n,head[110000],ver[110000],nxt[110000],tot,t[110000],cnt;
void add(int x,int y){
    tot++;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
int main(){
	cin>>n>>m;
	memset(head,-1,sizeof head);
	for(int i=1;i<=m;i++){
	    cin>>x>>y;
	    add(x,y);
	}
	for(int i=1;i<=n;i++){
	    cnt=0;
	     cout<<i<<":"<<" ";
	    for(int j=head[i];j!=-1;j=nxt[j]){
	        t[++cnt]=ver[j];
	    } 
	    sort(t+1,t+1+cnt);
	   for(int j=1;j<=cnt;j++){
	        cout<<t[j]<<" ";
	    }
	    if(head[i]==-1){
	        cout<<"zero";
	    }
	    cout<<endl;
	}
	   
	return 0;
}

图的前向星表示4

#include<bits/stdc++.h>
using namespace std; 
long long head[110000],ver[110000],nxt[110000],tot,quan[110000];
void add(int x,int y,int z){
    tot++;
    ver[tot]=y;
    quan[tot]=z;//权值
    nxt[tot]=head[x];//插入到head[x]表头上
    head[x]=tot;
}
int main(){
    long long x,y,z,m,n;
	cin>>n>>m;
	memset(head,-1,sizeof head);
	for(int i=1;i<=m;i++){
	    cin>>x>>y>>z;
	    add(x,y,z);
	}
	for(int i=1;i<=n;i++){
	     cout<<i<<":"<<" ";
	    for(int j=head[i];j!=-1;j=nxt[j]){
	        cout<<"(";
	        cout<<ver[j];
	        cout<<",";
	        cout<<quan[j];
	        cout<<")"<<" ";
	       
	    }
	    if(head[i]==-1){
	        cout<<"zero";
	    }
	    cout<<endl;
	}
	   
	return 0;
}

找树根和孩子

#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],maxx,f;
int main(){
    int n,m,x,y;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        a[y]=x;
        b[x]++;
    }
    for(int i=1;i<=n;i++){
        if(a[i]==0){
            cout<<i<<endl;
        }
    }
    for(int i=1;i<=n;i++){
        if(b[i]>maxx){
          maxx=b[i];
          f=i;
        }
    }
    cout<<f<<endl;
    for(int i=1;i<=n;i++){
        if(a[i]==f){
            cout<<i<<" ";
        }
    }
    return 0;
}

二叉树的遍历

#include<bits/stdc++.h>
using namespace std;
int n,x,a[1100],b[1100],cnt;
void zx(int root){ 
    if(a[root*2]!=0){
        zx(root*2); 
    }
      b[++cnt]=a[root];
    if(a[root*2+1]!=0){
        zx(root*2+1);
    }
    
}
int main(){
    cin>>n>>x;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    zx(1);
    b[0]=-1;
    for(int i=1;i<=cnt;i++){
        if(b[i]==x){
            cout<<b[i-1]<<"\n";
        }
    }
    return 0;
}

联通森林1

#include<bits/stdc++.h>
using namespace std;
int ver[1100000],nxt[1100000],head[1100000],tot,vis[1100000];
void add(int x,int y){
    tot++;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs(int x){
    vis[x]=1;
    for(int i=head[x];i!=-1;i=nxt[i]){
        if(vis[ver[i]]==0){
            dfs(ver[i]);
        }
    }
}
int main(){
    int n,m,x,y;
    cin>>n>>m;
    memset(head,-1,sizeof head);
    for(int i=1;i<=m;i++){
        cin>>x>>y;
       add(x,y);
       add(y,x);
    }
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(vis[i]==0){
            dfs(i);
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
}

联通森林2

#include<bits/stdc++.h>
using namespace std;
long long ver[2200000],nxt[2200000],head[1100000],tot,vis[1100000],sum=0;
void add(int x,int y){
    tot++;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs(int x){
    vis[x]=sum;
    for(int i=head[x];i!=-1;i=nxt[i]){
        if(vis[ver[i]]==0){
            dfs(ver[i]);
        }
    }
}
int main(){
    int n,m,x,y,q;
    scanf("%d%d%d",&n,&m,&q);
    memset(head,-1,sizeof head);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
       add(x,y);
       add(y,x);
    }
    for(int i=1;i<=n;i++){
        if(vis[i]==0){
            sum++;
            dfs(i);
        }
    }
    int a,b;
  for(int i=1;i<=q;i++){
      scanf("%d%d",&a,&b);
      if(vis[a]==vis[b]){
         printf("Yes");
         printf("\n");
      }
      else{
         printf("No");
         printf("\n");
      }
  }
    return 0;
}

美国血统问题

#include<bits/stdc++.h>
using namespace std; 
string q,z;
void s(string q,string z){
    char c=q[0];
    int r=z.find(c);
    string zq=q.substr(1,r);
    string zz=z.substr(0,r);
    string yq=q.substr(r+1,q.size()-r-1);
    string yz=z.substr(r+1,z.size()-r-1);
    if(r>0){
        s(zq,zz);
    } 
    if(r<z.size()-1){
        s(yq,yz);
    }
    cout<<c;
}
int main(){
    cin>>z>>q;
    s(q,z);
    return 0;
}

FBI树

#include<bits/stdc++.h>
using namespace std; 
string s;
void hx(int l,int r){
    if(l<r){
        int mid=(l+r)/2;
        hx(l,mid); 
        hx(mid+1,r); 
    }
    int f0=0,f1=0;
    for(int i=l;i<=r;i++){
        if(s[i]=='0'){
            f0=1;
        }
        else{
            f1=1;
        }
    }
    if(f0==1&&f1==1){
        cout<<"F";
    }
    else if(f0==0&&f1==1){
        cout<<"I";
    }
    else if(f0==1&&f1==0){
        cout<<"B";
    }
}
int main(){
    int n;
    cin>>n;
    cin>>s;
    hx(0,s.size()-1);
    return 0;
}

吝啬的国度

#include<bits/stdc++.h>
using namespace std;
int n,s,x,y;
long long ver[220000],nxt[220000],head[110000],vis[110000],f[110000],tot,sum=0;
void add(int x,int y){
    tot++;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs(int x){
    vis[x]=1;
    for(int i=head[x];i!=-1;i=nxt[i]){
        if(vis[ver[i]]==0){
            f[ver[i]]=x;
            dfs(ver[i]);
        }
    }
}
int main(){
    cin>>n>>s;
    memset(head,-1,sizeof head);
    for(int i=1;i<=n-1;i++){
       cin>>x>>y;
       add(x,y);
       add(y,x);
    }
    f[s]=-1;
    dfs(s);
    for(int i=1;i<=n;i++){
        cout<<f[i]<<" ";
    }
    return 0;
}

儿子个数统计1

#include<bits/stdc++.h>
using namespace std;
int n,a[2200000];
int main(){
   int x,y;
   cin>>n;
   for(int i=1;i<=n-1;i++){
       cin>>x>>y;
      a[x]++;
   }
   for(int i=1;i<=n;i++){
       cout<<a[i]<<" ";
   }
    return 0;
}

儿子个数统计2

#include<bits/stdc++.h>
using namespace std;
int n,a[1100000];
int main(){
   int x,y;
   cin>>n;
   for(int i=1;i<=n-1;i++){
       cin>>x>>y;
      a[x]++;
      a[y]++;
   }
  cout<<a[1]<<" ";
   for(int i=2;i<=n;i++){
       cout<<a[i]-1<<" ";
   }
    return 0;
}

树的深度

#include<bits/stdc++.h>
using namespace std; 
long long x,y,s,n,head[1100000],ver[1100000],nxt[1100000],dep[2200000],tot,vis[1100000];
void add(int x,int y){
    tot++;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs(int x){
    vis[x]=1;
    for(int i=head[x];i!=-1;i=nxt[i]){
        if(vis[ver[i]]==0){
            dep[ver[i]]=dep[x]+1;
            dfs(ver[i]);
        }
    }
}
int main(){
    cin>>n>>s;
     memset(head,-1,sizeof head);
  for(int i=1;i<=n-1;i++){
       cin>>x>>y;
       add(x,y);
       add(y,x);
    }   
    vis[s]=0;
    dfs(s);
    for(int i=1;i<=n;i++){
        cout<<dep[i]<<" ";
    }
	return 0;
}

树的权值深度

#include<bits/stdc++.h>
using namespace std; 
long long x,y,s,n,z,head[1100000],ver[1100000],nxt[1100000],dep[2200000],tot,vis[1100000],quan[1100000];
void add(int x,int y,int z){
    tot++;
    ver[tot]=y;
    quan[tot]=z;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs(int x){
    vis[x]=1;
    for(int i=head[x];i!=-1;i=nxt[i]){
        if(vis[ver[i]]==0){
            dep[ver[i]]=dep[x]+quan[i];
            dfs(ver[i]);
        }
    }
}
int main(){
    cin>>n>>s;
     memset(head,-1,sizeof head);
  for(int i=1;i<=n-1;i++){
       cin>>x>>y>>z;
       add(x,y,z);
       add(y,x,z);
    }   
    vis[s]=0;
    dfs(s);
    for(int i=1;i<=n;i++){
        cout<<dep[i]<<" ";
    }
	return 0;
}

二叉搜索树

#include<bits/stdc++.h>
using namespace std;
struct tree{
	int data,l,r,size;
}a[110000];
int tot,n,x;
char c;
void insert(int root,int k){
	if(a[root].data==0){
		tot++;
		a[tot].data=k;
		a[tot].size=1;
		return ;
	}
	if(a[root].data<k&&a[root].r==0){//右空 
		tot++;
		a[tot].data=k;
		a[tot].size=1;//叶子节点 
		a[root].r=tot;
		a[root].size++;
		return ;
	}
	if(a[root].data>k&&a[root].l==0){//左空 
		tot++;
		a[tot].data=k;
		a[tot].size=1;//叶子节点 
		a[root].l=tot;
		a[root].size++; 
		return ;
	}
	if(a[root].data<k){
		insert(a[root].r,k);
	}
	else if(a[root].data>k){
		insert(a[root].l,k);
	}
	a[root].size=a[a[root].l].size+a[a[root].r].size+1;//重新求当前节点的size 
}
int query(int root,int k){
	if(a[root].size==0){
		return 0;
	}
	if(a[root].data<k){
		return  a[a[root].l].size+ 1 +query(a[root].r,k);
	}
	else if(a[root].data==k){
		return a[a[root].l].size;
	}
	else{
	return query(a[root].l,k);
	}
} 
int main(){
   cin>>n;
   for(int i=1;i<=n;i++){
       cin>>c>>x;
       if(c=='i'){
            insert(1,x);
       }
      
      if(c=='q'){
           cout<<query(1,x)<<"\n";
       }
   }
    return 0;
}

思考题

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
   int n,a;
   cin>>n;
   for(int i=1;i<=n;i++){
       cin>>a;
       q.push(a);
   }
   long long sum=0;
   while(q.size()>1){
       int x=q.top();
       q.pop();
       int y=q.top();
       q.pop();
       sum+=x+y; 
       q.push(x+y);
   }
   cout<<sum;
    return 0;
}

优先队列

#include<bits/stdc++.h>
using namespace std;
priority_queue<int>q;
int n,l,p;
struct node{
   int fule;
   int dist;
}s[11000];
bool cmp(node a,node b){
    return a.dist>b.dist;
}
int main(){
    cin>>n>>l>>p;
    for(int i=0;i<n;i++){
        cin>>s[i].dist;
    }
    for(int i=0;i<n;i++){
        cin>>s[i].fule;
    }
    sort(s,s+n,cmp);
    s[n].dist=0;
    for(int i=0;i<=n;i++){
        s[i].dist=l-s[i].dist;
    }
    int fules=p,ans=0,pos=0,d;
    for(int i=0;i<=n;i++){
        d=s[i].dist-pos;
        while(fules<d){
            if(q.empty()){
                cout<<-1;
                return 0;
            }
            fules+=q.top();
            q.pop();
            ans++;
        }
        fules-=d;
        pos=s[i].dist;
        q.push(s[i].fule);
    }
    cout<<ans;
    return 0;
}

迷宫问题

#include<bits/stdc++.h>
using namespace std; 
int vis[15][15],dx[]={0,-1,-1,-1,0,0,1,1,1},dy[]={0,-1,0,1,-1,1,-1,0,1},sum;
int a[15][15];
int n;
void dfs(int x,int y){
    if(x==1&&y==n){
        sum++;
        return ;
    }
	 vis[x][y]=1;
	 for(int i=1;i<=8;i++){
	 	int nx=x+dx[i];
		int ny=y+dy[i]; 
		if(nx>=1&&nx<=n&&ny>=1&&ny<=n){
			if(vis[nx][ny]==0&&a[nx][ny]!=1){
				dfs(nx,ny);
			}
		}
	 }
	 vis[x][y]=0;
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }
    dfs(1,1);
     cout<<sum;
      return 0;
}

瓷砖

#include<bits/stdc++.h>
using namespace std; 
char a[55][55];
int vis[55][55],n,m,cnt=1,b[55][55];
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,1,-1};
void dfs(int x,int y){
     vis[x][y]=1;
	 for(int i=1;i<=4;i++){
	 	int nx=x+dx[i];
		int ny=y+dy[i]; 
		if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
			if(vis[nx][ny]==0&&b[nx][ny]==0){
				dfs(nx,ny);
				cnt++;
			}
		}
	 }
}
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(a[i][j]=='.'){
                b[i][j]=0;
            }
            else if(a[i][j]=='#'){
                b[i][j]=1;
            }
            else if(a[i][j]=='@'){
                b[i][j]=2;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(b[i][j]==2){
                dfs(i,j);
            }
        }
    }
    cout<<cnt;
    return 0;
}

最大黑区域

#include<bits/stdc++.h>
using namespace std; 
int vis[105][105],a[105][105],n,m,maxx;
int dx[]={0,-1,1,0,0},dy[]={0,0,0,1,-1};
int cnt;
void dfs(int x,int y){
    cnt++;
    vis[x][y]=1;
   for(int i=1;i<=4;i++){
	 	int nx=x+dx[i];
		int ny=y+dy[i]; 
		if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
			if(vis[nx][ny]==0&&a[nx][ny]==1){
				dfs(nx,ny);
			}
		}
	 }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
             cnt=0;
            if(vis[i][j]==0&&a[i][j]==1){
                dfs(i,j);
                maxx=max(maxx,cnt);
            }
        }
    }
    cout<<maxx;
    return 0;
}

图的遍历——深度优先搜索

#include<bits/stdc++.h>
using namespace std; 
int a[105][105],n,vis[1005];
void dfs(int x){
    vis[x]=1;   
    cout<<x-1<<" ";
    for(int i=1;i<=n;i++){
        if(vis[i]==0&&a[x][i]!=0){
           dfs(i);
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){ 
        for(int j=1;j<=n;j++){
            cin>>a[i][j]; 
        } 
    }
   for(int i=1;i<=n;i++){
       if(vis[i]==0){
           dfs[i];
       }
   }
    return 0;
}

猴群

#include<bits/stdc++.h>
using namespace std; 
int vis[105][105],dx[5]={0,-1,1,0,0},dy[5]={0,0,0,1,-1},sum;
char a[105][105];
int b[105][105];
int n,m;
void dfs(int x,int y){
	 vis[x][y]=sum;
	 for(int i=1;i<=4;i++){
	 	int nx=x+dx[i];
		int ny=y+dy[i]; 
		if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
			if(vis[nx][ny]==0&&b[nx][ny]!=0){
				dfs(nx,ny);
			}
		}
	 }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            b[i][j]=a[i][j]-'0';
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(vis[i][j]==0&&b[i][j]!=0){
                sum++;
                dfs(i,j);
            }
        }
        
    }
    cout<<sum;
    return 0;
}

全排列

#include<bits/stdc++.h>
using namespace std;
char ans[110],a[10];
int vis[100];
int len;
void dfs(int x){
    if(x==len){
        for(int i=0;i<len;i++){
            cout<<ans[i];
        }
        cout<<endl;
        return ;
    }
    for(int i=0;i<len;i++){
        if(vis[i]==0){
            ans[x]=a[i];
            vis[i]=1;
            dfs(x+1);
            vis[i]=0;
         }
    }
}
int main() {
    cin>>a;
   len=strlen(a);
   dfs(0);
	return 0;

}

全排列问题

#include<bits/stdc++.h>
using namespace std;
int n,vis[110],ans[110];
void dfs(int x) { //搜位置
	if(x==n+1) {//前n个位置都搜好了
		for(int i=1; i<=n; i++) {
			cout<<setw(5)<<ans[i];
		}
		cout<<endl;
		return ;
	}
	for(int i=1; i<=n; i++) {
		if(vis[i]==0) {
			ans[x]=i;//x位置选i
			vis[i]=1;
			dfs(x+1);//下一个位置
			vis[i]=0;
		}
	}

}
int main() {
	cin>>n;
	dfs(1);
	return 0;

}

素数圆环

#include<bits/stdc++.h>
using namespace std;
int n,ans[110],vis[110];
int p(int n){
    for(int i=2;i<=n-1;i++){
        if(n%i==0){
            return 0;
        }
    }
    return 1;
}
void dfs(int w){
    if(w==n+1){
        for(int i=1;i<=n;i++){
            cout<<ans[i]<<" ";
        }
        cout<<endl;
    }
    for(int i=2;i<=n;i++){
        if(w==n&&vis[i]==0&&p(i+1)&&p(i+ans[w-1])){
            ans[w]=i;
            vis[i]=1;
            dfs(w+1);
            vis[i]=0;
        }
        else if(w!=n&&vis[i]==0&&p(i+ans[w-1])){
            ans[w]=i;
            vis[i]=1;
            dfs(w+1);
            vis[i]=0;
        }
    }
}
int main() {
    int sum=0;
    while(cin>>n){
        ans[1]=1;
        sum++;
        cout<<"Case "<<sum<<":"<<endl;
        if(n!=1){
              dfs(2);
        }
        cout<<endl;
    }
	return 0;

}

小猫爬山

#include<bits/stdc++.h>
using namespace std;
int m,k;
int a[20],w[20];
int ans;
void dfs(int n,int g){//第n只小猫,有g个组 
	if(g>=ans){//组数多 
		return ;
	}
	if(n==m+1){
		ans=g;
		return ;
	}
	for(int i=1;i<=g;i++){
		if(w[i]+a[n]<=k){
			w[i]+=a[n];
			dfs(n+1,g);
			w[i]-=a[n];
		}
	}
	w[g+1]=a[n];
	dfs(n+1,g+1);
	w[g+1]=0;
}
int main() {
	cin>>m>>k;
	ans=m;//最少组数初始化,为猫的数量 
	for(int i=1;i<=m;i++){
		cin>>a[i];
	}
	sort(a+1,a+m+1);
	reverse(a+1,a+m+1);
	dfs(1,0);
	cout<<ans;
	return 0;

}

01背包问题

#include<bits/stdc++.h>
using namespace std;
int maxx,m,n;
struct s{
    int wi,ci;
}a[220];
void dfs(int x,int sumw,int sumv){
    if(x==n+1){
        if(sumw<=m){
            maxx=max(maxx,sumv);
        }
        return ;
    }
    dfs(x+1,sumw,sumv);
    dfs(x+1,sumw+a[x].wi,sumv+a[x].ci);
} 
int main() {
  cin>>m>>n;
  for(int i=1;i<=n;i++){
      cin>>a[i].wi>>a[i].ci;
  }
  dfs(1,0,0);
  cout<<maxx;
	return 0;

}

分成互质组

#include<bits/stdc++.h>
using namespace std;
long long vis[20];
int a[20],n;
int minn=15;
int gcd(int a,int b){//求最大公因数(递归法)
    if(a%b==0){
        return b;
    }
    else return gcd(b,a%b);
}
void dfs(int k,int s){
    if(s==n+1){//n个数都放完了
        if(k<minn){
            minn=k;//求最小值
        }  
        return ;//无条件返回
    }
    for(int i=1;i<=k;i++){
        if(gcd(a[s],vis[i])==1){//如果当前数字和互质组内已有数字的最大公约数是1,则说明互质
            vis[i]*=a[s];
            dfs(k,s+1);
            vis[i]/=a[s];//回溯的话需要把当前数字从刚才的互质组再取出来
        }
    }
    vis[k+1]*=a[s];//最后一种可能收数字单独新开一个互质组
    dfs(k+1,s+1);//互质组数量多了一个,给下一个数字搜索互质
    vis[k+1]/=a[s];//回溯
}
int main() {
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=10;i++){//vis数组赋值(n的最大值)
        vis[i]=1;
    } 
    dfs(1,1);
    cout<<minn;
	return 0;
}

骑士遍历初级版(小数据)

#include<bits/stdc++.h>
using namespace std;
int dx[5]={0,1,2,2,1},dy[5]={0,-2,-1,1,2};
int n,m,rode[110];
int flag=0;
void dfs(int x,int y,int k){
	if(flag==1){
		return ;
	}
    if(x==n&&y==m){
    	flag=1;
        for(int i=0;i<k;i++){
            cout<<rode[i]<<" ";
        }
        return ;
    }
    for(int i=1;i<=4;i++){
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
            rode[k]=i;
            dfs(nx,ny,k+1);
        }
    }
}
int main(){
    cin>>n>>m;
    dfs(1,1,0);
	if(flag==0){
		cout<<"-1";
	}
 return 0;
}

N皇后

#include<bits/stdc++.h>
using namespace std;
int zs[30],ys[30],sum,c[30],ans[30],n;
void dfs(int x){
    if(x==n+1){ 
        sum++;
        if(sum<=3){
	        for(int j=1;j<=n;j++){
	            cout<<ans[j]<<" ";
	        }
	        cout<<endl;
        }
     return ;
    }
         for(int i=1;i<=n;i++){
          if(c[i]==0&&zs[x-i+n]==0&&ys[x+i]==0){
               ans[x]=i;//存答案列 
                c[i]=1;
                zs[x-i+n]=1;
                ys[x+i]=1;
                dfs(x+1);
                c[i]=0;
                zs[x-i+n]=0;
                ys[x+i]=0;
            }
}
   
}
int main() {
    cin>>n;
     dfs(1);
     cout<<sum;
	return 0;
 
}

八皇后问题

#include<bits/stdc++.h>
using namespace std;
int a[10][10],sum;
bool c(int x,int y){
	for(int i=1;i<x;i++){
		if(a[i][y]==1){
			return  0; 
		} 
	}
	for(int i=x-1,j=y-1;i>=1&&j>=1;i--,j--){
		if(a[i][j]==1){
			return 0;
		}
	}
	for(int i=x-1,j=y+1;i>=1&&j<=8;i--,j++){
		if(a[i][j]==1){
			return 0;
		}
	}
	return 1;
}
void dfs(int x){
    if(x==9){
	   sum++;
        cout<<"No. "<<sum<<endl;
        for(int i=1;i<=8;i++){
            for(int j=1;j<=8;j++){
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        return ;
    }
    else{
        
         for(int i=1;i<=8;i++){//x行放i列
            if(c(x,i)){
                a[x][i]=1;
                dfs(x+1);
                a[x][i]=0;
            }
    }
}
   
}
int main() {
     dfs(1);//从第一行开始
	return 0;
 
}

棋盘问题

#include<bits/stdc++.h>
using namespace std;
int sum,c[30],ans[30],n,m,d;
char s[30][30]; 
void dfs(int x,int d){
    if(m<d){
    	sum++;
    	return ;
	}
	if(x>n){
		return ;
	}
	for(int i=1;i<=n;i++){
		if(s[x][i]=='#'&&c[i]==0){
			c[i]=1;
			dfs(x+1,d+1);
			c[i]=0;
		}
	}
	dfs(x+1,d);
}
int main() {
    while(cin>>n>>m){
        if(n==-1&&m==-1){
            return 0;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin>>s[i][j];
            }
        }
        sum=0;
		dfs(1,1);
       cout<<sum<<endl;
    }
     
	return 0;
 
}

骑士遍历初级版

#include<bits/stdc++.h>
using namespace std;
int dx[5]={0,1,2,2,1},dy[5]={0,-2,-1,1,2};
int n,m,rode[110];
int flag=0;
void dfs(int x,int y,int k){
	if(flag==1){
		return ;
	}   
	if((m-y)>2*(n-x)){
    	return ;
	}
    if(x==n&&y==m){
    	flag=1;
        for(int i=0;i<k;i++){
            cout<<rode[i]<<" ";
        }
        return ;
    }
 
    for(int i=1;i<=4;i++){
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
            rode[k]=i;
            dfs(nx,ny,k+1);
        }
    }
}
int main(){
    cin>>n>>m;
    dfs(1,1,0);
	if(flag==0){
		cout<<"-1";
	}
 return 0;
}

走迷宫

#include<bits/stdc++.h>
using namespace std;
char a[50][50];
int r,c,step[105][105],vis[105][105],dy[5]={0,0,0,1,-1},dx[5]={0,1,-1,0,0};
queue<int>qx,qy;
void bfs(int stx,int sty){
    qx.push(stx);
    qy.push(sty);
    vis[stx][sty]=1;
    step[stx][sty]=1;
    //遍历队列
    while(qx.empty()==0){
        int x=qx.front();//取队头
        int y=qy.front();
        qx.pop();//出队
        qy.pop();
        for(int i=1;i<=4;i++){//发散
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(nx>=1&&nx<=r&&ny>=1&&ny<=c){
            if(a[nx][ny]=='.'&&vis[nx][ny]==0){
                qx.push(nx);
                qy.push(ny);
                vis[nx][ny]=1;
                step[nx][ny]=step[x][y]+1;
            }
        }
       }
    }
}
int main(){
    cin>>r>>c;
    for(int i=1;i<=r;i++){
        for(int j=1;j<=c;j++){
            cin>>a[i][j];
        }
    }
    bfs(1,1);
            cout<<step[r][c]<<" ";
    return 0;
}

关系网络

1.深搜

#include<bits/stdc++.h>
using namespace std;
int a[110][110],c[11000],x,y,n,sum,ans=10000;
void dfs(int m,int u){
    if(m==y){
        ans=min(ans,u);
        return ;
    }
    c[m]=1;
    for(int i=1;i<=n;i++){
        if(a[m][i]==1&&c[i]==0){
                dfs(i,u+1);
            }
        }
        c[m]=0;
}
int main(){
    cin>>n>>x>>y;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }
    dfs(x,1);
    cout<<ans-2;
	return 0;
} 

2.广搜

#include<bits/stdc++.h>
using namespace std;
int step[1100],vis[1100],n,x,y;
int a[110][110];
queue<int>q;
void bfs(int x) {
	q.push(x);
	vis[x]=1;
	step[x]=1;
	while(q.empty()==0) {
		int s=q.front();
		q.pop();
		for(int i=1; i<=n; i++) {
			if(a[s][i]==1&&vis[i]==0) {
				q.push(i);
				vis[i]=1;
				step[i]=step[s]+1;
			}
		}
	}
}
int main() {
	cin>>n>>x>>y;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			cin>>a[i][j];
		}
	}
	bfs(x);
	cout<<step[y]-2;
	return 0;
}

图的遍历——广度优先搜索

#include<bits/stdc++.h>
using namespace std;
int step[1100],vis[1100],n,x,y;
int a[110][110];
queue<int>q;
void bfs(int x) {
	q.push(x);
	vis[x]=1;
	step[x]=1;
	while(q.empty()==0) {
		int s=q.front();
		cout<<s-1<<" ";
		q.pop();
		for(int i=1; i<=n; i++) {
			if(a[s][i]==1&&vis[i]==0) {
				q.push(i);
				vis[i]=1;
				step[i]=step[s]+1;
			}
		}
	}
}
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			cin>>a[i][j];
		}
	}
	bfs(1);
	
	return 0;
}

小可走迷宫

#include<bits/stdc++.h>
using namespace std;
char a[1100][1100];
int t,n,m,step[1150][1150],vis[1150][1150],dy[5]={0,0,0,1,-1},dx[5]={0,1,-1,0,0};
struct node{
    int x,y;
};
queue<node>q;
void bfs(int x,int y){
    q.push({x,y});
    vis[x][y]=1;
    step[x][y]=1;
    while(q.empty()==0){
        node t=q.front();
        if(a[t.x][t.y]=='E'){
            cout<<step[t.x][t.y]-1<<endl;
            return ;
        }
        q.pop();
        for(int i=1;i<=4;i++){
            int nx=t.x+dx[i];
            int ny=t.y+dy[i];
            if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
                if(a[nx][ny]!='#'&&vis[nx][ny]==0){
                       q.push({nx,ny});
                       vis[nx][ny]=1;
                       step[nx][ny]=step[t.x][t.y]+1;
                }
            }
        } 
    }
    cout<<"-1"<<endl;
}
int main(){
    cin>>t;
    for(int i=1;i<=t;i++){ 
    int fi,fj;
        while(q.empty()==0){
            q.pop();
        }
        memset(vis,0,sizeof vis);
        memset(step,0,sizeof step);
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
                if(a[i][j]=='S'){
                	fi=i;
                	fj=j;
            }
        }            
    } 
	bfs(fi,fj);
    }
    return 0;
}

矩阵距离

#include<bits/stdc++.h>
using namespace std;
int dx[]={0,0,0,-1,1},
    dy[]={0,-1,1,0,0}; 
char a[1100][1100];
int n,m,step[1100][1100],vis[1100][1100];
queue<int>qx,qy;
void bfs(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='1'){
                 qx.push(i);
                 qy.push(j);
                 vis[i][j]=1;
                 step[i][j]=1;
            }
        }
    }
    while(qx.empty()==0&&qy.empty()==0){
        int fqx=qx.front();
        int fqy=qy.front();
        qx.pop();
        qy.pop();
        for(int i=1;i<=4;i++){
            int nx=fqx+dx[i];
            int ny=fqy+dy[i];
            if(nx<=n&&nx>=1&&ny<=m&&ny>=1){
                if(vis[nx][ny]==0){
                    qx.push(nx);
                    qy.push(ny);
                    vis[nx][ny]=1;
                    step[nx][ny]=step[fqx][fqy]+1;
                }
            }
        }
    }
}
int main(){
   cin>>n>>m;
   for(int i=1;i<=n;i++){
       for(int j=1;j<=m;j++){
          cin>>a[i][j];
       }
   }
   bfs();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            printf("%d ",step[i][j]-1);
        }
        printf("\n");
    }
	return 0;
} 

最少步数 

#include<bits/stdc++.h>
using namespace std;
int dx[]={0,-2,-2,-1,1,2,2,2,2,1,-1,-2,-2},
    dy[]={0,1,2,2,2,2,1,-1,-2,-2,-2,-2,-1}; 
int a[110][110],ax,ay,bx,by,step[110][110],vis[110][110];
queue<int>qx,qy;
void bfs(int x,int y){
    qx.push(x);
    qy.push(y);
    vis[x][y]=1;
    step[x][y]=1;
    while(qx.empty()==0&&qy.empty()==0){
        int fx=qx.front();
        int fy=qy.front();
        qx.pop();
        qy.pop();
        for(int i=1;i<=12;i++){
            int nx=fx+dx[i];
            int ny=fy+dy[i];
            if(nx<=100&&nx>=1&&ny<=100&&ny>=1){
                if(vis[nx][ny]==0){
                    qx.push(nx);
                    qy.push(ny);
                    vis[nx][ny]=1;
                    step[nx][ny]=step[fx][fy]+1;
                }
            }
        }
    }
}
int main(){
    cin>>ax>>ay>>bx>>by;
    bfs(1,1);
    cout<<step[ax][ay]-1<<endl<<step[bx][by]-1;
	return 0;
} 

Labyrinth 

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y,sx,sy;
};
int vis[2005][2005],step[2005][2005];
int dy[]={0,0,-1,1},
    dx[]={-1,1,0,0}; 
int n,m,r,c,sx,sy,cnt=0;
char a[12005][2005];
deque<node>q;
void bfs(int x,int y,int ssx,int ssy){
    q.push_front({x,y,ssx,ssy});
    vis[x][y]=1;
    step[x][y]=0;
    while(q.empty()==0){
        node t=q.front();
        q.pop_front();
        cnt++;
        for(int i=0;i<4;i++){
             int nx=t.x+dx[i];
             int ny=t.y+dy[i];
             if(nx>=1&&nx<=n&&ny<=m&&ny>=1&&vis[nx][ny]==0&&a[nx][ny]!='*'){
                 if(i==2&&t.sx>0){
                     q.push_back({nx,ny,t.sx-1,t.sy});
                     vis[nx][ny]=1;
                     vis[nx][ny]=step[t.x][t.y]+1;
                 }
                 else if(i==3&&t.sy>0){
                      q.push_back({nx,ny,t.sx,t.sy-1});
                     vis[nx][ny]=1;
                     vis[nx][ny]=step[t.x][t.y]+1;
                 }
                 else if(i==0||i==1){
                      q.push_front({nx,ny,t.sx,t.sy});
                     vis[nx][ny]=1;
                     vis[nx][ny]=step[t.x][t.y]+1;
                 }
             }
        }
    }
}
int main(){
    cin>>n>>m>>r>>c>>sx>>sy;
    for(int i=1;i<=n;i++){
     for(int j=1;j<=m;j++){
         cin>>a[i][j];
     }
    }
    bfs(r,c,sx,sy);
    cout<<cnt;
    return 0;
}

最小DFS序

#include<bits/stdc++.h>
using namespace std;
int a[1100][1100],vis[1100000];
int n,s,x,y;
void dfs(int x){
    cout<<x<<" ";
    vis[x]=1;
    for(int i=1;i<=n;i++){
         if(vis[i]==0&&a[i][x]==1){
                    dfs(i);
                }
        }
        cout<<x<<" ";
}
int main(){
    cin>>n>>s;
    for(int i=1;i<=n-1;i++){
        cin>>x>>y;
        a[x][y]=1;
        a[y][x]=1;
    }
	dfs(s);

    
	return 0;
} 

树的重心1

#include<bits/stdc++.h>
using namespace std;
int ver[220000],nxt[220000],head[220000],tot,vis[220000],size[110000],zx,minn=110000,n,s,x,y;
void add(int x,int y){
    tot++;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs(int x){
    vis[x]=1;
    size[x]=1;
    int maxx=0;
    for(int i=head[x];i!=-1;i=nxt[i]){
        if(vis[ver[i]]==0){
            dfs(ver[i]);
            size[x]+=size[ver[i]];
            maxx=max(maxx,size[ver[i]]);
            
        }
    }
    maxx=max(maxx,n-size[x]);
    if(maxx<minn){
        minn=maxx;
        zx=x;
    }
}
int main(){
    cin>>n>>s;
    memset(head,-1,sizeof head);
    for(int i=1;i<=n-1;i++){
        cin>>x>>y;
       add(x,y);
       add(y,x);
    }
   dfs(s);
   cout<<zx<<" "<<minn;
     return 0;
} 

树的直径1

#include<bits/stdc++.h>
using namespace std;
int n,a,b,c,ver[22000],head[22000],nxt[22000],dep[11000],vis[22000],q[22000],tot,maxx,t;
void add(int x,int y,int z){
    tot++;
    ver[tot]=y;
    q[tot]=z;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs(int x){
    vis[x]=1;
    for(int i=head[x];i!=-1;i=nxt[i]){
        if(vis[ver[i]]==0){
            dep[ver[i]]=dep[x]+q[i];
            if(maxx<dep[ver[i]]){
                 maxx=dep[ver[i]];
                 t=ver[i];
            }
           dfs(ver[i]);
        }
    }
}
int main(){
    cin>>n;
    int m=0;
    memset(head,-1,sizeof head);
    for(int i=1;i<=n-1;i++){
        cin>>a>>b>>c;
       add(a,b,c);
       add(b,a,c);
    } 
    dfs(1); 
     memset(dep,0,sizeof dep);
     memset(vis,0,sizeof vis);
    dfs(t);
    for(int i=1;i<=n;i++){
         if(maxx<i){
             maxx=i;
         }
    }
    cout<<maxx;
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值