hdu 6321-Dynamic Graph Matching

6321-Dynamic Graph Matching

题意:给定一个n 个点的无向图,m 次加边或者删边操作。在每次操作后统计有多少个匹配包含k = 1, 2, ..., n/2 条边。

题解:状压DP。先放官方题解,我觉得讲的蛮清楚的。

hdu 6321-Dynamic Graph Matching_第1张图片

我再说一下我的理解,首先S表示的是一个集合,里面表示的是哪个点被选了哪个点没有,因为n最多10,所以我们可以用二进制来表示一个集合里面的情况,第i位为0表示第i个数没有选进集合,为1表示在集合中。这样我们开的 dp数组(就是上面的f,我习惯用dp),只用开到1<<10就好了,对于加边x,y操作,有这两条边的一定是S的第(1<

附上代码:

#include
const int maxn=1<<10,P=1000000007;
int T,n,m,all,i,x,y,S,dp[maxn],cnt[maxn],ans[maxn];
char c[9];
inline void add(int&a,int b)
{
    a=a+b=0?a-b:a-b+P;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        all=1<

 

你可能感兴趣的:(多校,DP)