P9980 [USACO23DEC] Flight Routes G 题解
题意:
给定一个
n 个点的 DAG,并且有向边一定从编号小的点连向编号大的点,现在给出了两两间路径条数的奇偶性,问原图有多少条连边,可以证明答案唯一确定。n\leq 750
首先你需要知道如何求解这个问题的逆向问题,即给定一个这样的图,输出两两点连边的奇偶性,显然考虑一个 dp,设
然后考虑简化问题,只有两个点的时候怎么办?显然奇偶性为
用 bitset 实现的,因为可以发现逆向转移实际上就是在做一个异或。
#include<bits/stdc++.h>
#define ONLINE_JUDGE
#define INPUT_DATA_TYPE int
#define OUTPUT_DATA_TYPE int
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){if(x<0)x=-x,putchar('-');if(x>9)print(x/10);putchar(x%10^48);return;}
std::bitset<750> e[750],sour[750];
int main(){
register char c;
register int i,j,res=0;
int n=read();
for(i=0;i<n;++i){
for(j=i+1;j<n;++j){
loop:c=getchar();
if(c!='0'&&c!='1') goto loop;
sour[i][j]=e[i][j]=c-'0';
}
}
for(i=n-1;~i;--i)
for(j=i+1;j<n;++j)
if(e[i][j]){
++res;
e[i]=e[i]^sour[j];
}
print(res);
return 0;
}