Spanning Tree Removal

题意:
给你一个任意两点相连的图,你每次移除生成树,如何能移除生成树的次数最大,并打印移除生成树的方法。
思路:
构造
草稿纸画图突然发现:
在这里插入图片描述
以此类推

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const ll mod = 1e9 +7;
const ll MAXN = 1e6 + 5;
  
int cnt,n,ans;
int f[505][1005];
int a[3005];
void init(){
    for(int i=1;i<=n;i++){
        a[i]=i;
    }
    for(int i=n+1;i<=2*n;i++){
        a[i]=i-n;
    }
    return;
}
  
void find(){
    for(int i=1;i<=ans;i++){
        for(int j=1;j<=n;j++){
            int base;
            if(j%2) base=-1;
            else base=1;
            f[i][j]=a[n+2-i+(j/2)*base];
        }
    }
}
  
void solve(){
    cnt++;
    cin>>n;
    init();
    ans=n/2;
    cout<<"Case #"<<cnt<<": "<<ans<<endl;
    find();
    for(int i=1;i<=ans;i++){
        for(int j=1;j<=n-1;j++){
            cout<<f[i][j]<<" "<<f[i][j+1]<<endl;
        }
    }
}
  
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
发布了35 篇原创文章 · 获赞 4 · 访问量 4305

猜你喜欢

转载自blog.csdn.net/Meulsama/article/details/104346955