鏈結
給定n個點m條邊的圖,和n個di值,對於1<=i<=n,問能否刪除某些邊使得,第i個點所連邊數都為di
當時這題旁邊有人用最大流過了,但是真演算法是一般圖最大匹配。
需要把所有點進行以下處理。
大佬部落格
這個拆度和拆邊思路可以記一下
雖然的確不知道原理。
要注意本題d的範圍為1或2。
拆邊拆度之後所有的d都為1,即一般圖匹配。
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define inf 0x3f3f3f3f3f3f3f3f
#define half (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define lson lsn, l, mid
#define rson rsn, mid+1, r
#define ql lson, ql, qr
#define qr rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxn = 310, maxm = 4e3+ 7;
int n, m, head[maxn], cnt, l, id[55][2], d[maxn];
struct eddge
} edge[maxm];
inline void addeddge(int u, int v)
inline void _add(int u, int v)
struct dhs
inline int lca(int x, int y)}}
}void blossom(int x, int y, int p)
if (fid(x) == x) fa[x] = p;
if (fid(y) == y) fa[y] = p;
x = pre[y];}}
int aug(int s)
while (!q.empty()) q.pop();
q.push(s);vis[s]=1;
while (!q.empty())
return 1;
}vis[match[v]] = 1;
q.push(match[v]);
}else}}
return 0;
}inline int solve()
return ans;
}} dhs;
inline void init()
}int main()
init();
for(int i=1, u, v; i<=m; i++)
dhs.node++;
dhs.match[dhs.node] = dhs.tim[dhs.node] = 0;
head[dhs.node] = -1;
for(int i=0;i_add(dhs.node,dhs.node-1);
/* if(d[u] == 2 && d[v] == 2)
else
}}*/
}printf(dhs.solve() *2 == dhs.node ? "yes\n" : "no\n");
// cout<}
return 0;
}
2020 牛客多校第一場
a b suffix array f infinite string comparision jzk開場提出了兩倍最大的長度,然後 dh 說直接比較a b和b a即可,由於是訓練賽,不想寫太長的 然後交了一發直接比較的 就過了 includeusing namespace std string s1...
2020牛客多校第一場 A題
題意 給乙個字串,求出按函式的方法得到的b,b的所有以pi為起點的字尾按字典序排序。得到pi的序列。思路 找字尾陣列c 找到第i個後面與它相同字元的距離 可以證明b陣列與c陣列對應的字尾字典序是相反的。求c陣列的時候有些操作也在下面位址裡。上面兩個的位址 大佬位址 找出每個字尾陣列後,排序就可以了,...
2020牛客暑假多校 第一場 E,J
本題相當於比較 a b 與 b a 這裡簡要證明一下,以樣例的第三組資料為例子。a aba b abaa a b abaabaa b a abaaaba 很清楚地發現,a b b a,這樣怎麼推出a b呢,我們一步步看,首先a 0 b 0 a 1 b 1 a 2 b 2 說明a的所有元素與b的前三個...