# Commit 命名规范

  • feat: 一个新功能
  • fix: 一个 bug 修复
  • docs: 仅仅修改了文档,比如 README, CHANGELOG, CONTRIBUTE 等
  • style: 不影响代码逻辑的修改,比如空格、格式缩进、删除分号等
  • refactor: 代码重构
  • perf: 提升性能的改动
  • test: 增加或修改测试
  • chore: 改变构建流程、或者增加辅助工具、依赖库等

# 码风

  • 凡继承自 C 语言的库,均使用 <xxx.h> 而不是 <cxxx>

  • 以下情况中,运算符前后 一定 不加空格:

    • for 循环括号内内容较短时(e.g. for(int i=1; i<=n; ++i)

    • 运算符前后关系较密切时

  • 以下情况中,运算符前后 一般 不加空格:

    • 变量名长度为 1 时
  • 以下情况中,运算符前后 很可能 不加空格:

    • 考试即将结束时
  • 以下情况中,运算符前后 不可能 不加空格:

    • 除以上情况之外的所有情况
  • typedef long long ll

# e.g.

2-SAT 模板节选)

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stack>
using namespace std;
const int N = 2e6 + 10;
struct node {
    int u, v, next;
    node() {}
    node(int _u, int _v, int _next): u(_u), v(_v), next(_next) {}
} e[N];
int h[N], tot = 0;
void add(int u, int v) {
    e[++tot] = node(u, v, h[u]);
    h[u] = tot;
}
int dfn[N], low[N], tag = 0;
int id[N], num = 0;
stack<int> s;
int n, m;
void tarjan(int u) {
    dfn[u] = low[u] = ++tag;
    s.push(u);
    for(int i = h[u]; i; i = e[i].next) {
        int v = e[i].v;
        if(dfn[v]) {
            if(!id[v]) low[u] = min(low[u], dfn[v]);
        } else {
            tarjan(v);
            low[u] = min(low[u], low[v]);
        }
    }
    if(dfn[u] == low[u]) {
        id[u] = ++num;
        for(; s.top() != u; s.pop()) 
            id[s.top()] = num;
        s.pop();
    }
}
int main() {
    
    freopen("p4782.in", "r", stdin);
    
    scanf("%d%d", &n, &m);
    for(int i=1, _i, a, _j, b, u, v; i<=m; ++i) {
        scanf("%d%d%d%d", &_i, &a, &_j, &b);
        u = (_i-1)*2 + a, v = (_j-1)*2 + b;
        add(u^1, v);
        add(v^1, u);
    }
    
    for(int i=0; i<(n<<1); ++i)
        if(!dfn[i]) tarjan(i);
    
    for(int i=0; i<(n<<1); i+=2) {
        if(id[i] == id[i^1]) {
            printf("IMPOSSIBLE\n");
            return 0;
        }
    }
    
    printf("POSSIBLE\n");
    for(int i=0; i<(n<<1); i+=2) 
        printf("%d ", id[i] < id[i^1] ? 0 : 1);
    
    return 0;
}
更新于