「CTSC2016」单调上升路径

「CTSC2016」单调上升路径

解题思路:根据提示可以得到答案的下界是 \(n - 1\) ,然后打表发现这个下界好像一定可以取到.

事实上考虑 \(n\) 个点完全图的边数是 \(\frac{n(n-1)}{2}\), 如果 \(n\) 是偶数,那么可以把边成 \(n-1\) 组,每一组 \(\frac{n}{2}\) 条边,并且每组的边都不在端点相交,如果从小到大安排上边权,显然每一组只能走一条边,答案是 \(n-1\)

构造不在端点相交可以单独拿出一个点 \(x\) 放在中间,其他点围成一圈,每次拿 \(x\) 和一个其它点连边,剩下的点就可以一一对应过去,这样就能构造出来了.

/*program by mangoyang*/
#include <bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
    int ch = 0, f = 0; x = 0;
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
    for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
    if(f) x = -x;
}
int s[505][505], cnt, n;
int main(){
    read(n);
    for(int i = 1, x, y; i < n; i++){
        s[i][n] = ++cnt, x = i, y = i;
        for(int j = 1; j <= (n - 1) / 2; j++){
            x = x == 1 ? n - 1 : x - 1;
            y = y == n - 1 ? 1 : y + 1;
            s[Min(x, y)][Max(x, y)] = ++cnt;
        }
    }
    for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++) printf("%d ", s[i][j]);
}

转载于:https://www.cnblogs.com/mangoyang/p/10416308.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值