比赛 期末考试2 评测结果 AATTEETEEEEEEEEEEEEEEEEEE
题目名称 数好图 最终得分 8
用户昵称 RpUtl 运行时间 6.227 s
代码语言 C++ 内存使用 3.49 MiB
提交时间 2026-02-10 11:11:17
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int mod=1e9+7;
const int N=1000;
int n,c,mk[500],vis1[400],vis2[400],ans[N];
struct edge{
	int u,v;
}e[500];
vector<int>G[N],F[N];
void DFS1(int x){
	vis1[x]=1;
	for(auto y:G[x]){
		if(vis1[y])continue;
		DFS1(y);
	}
	return;
}
void DFS2(int x){
	vis2[x]=1;
	for(auto y:F[x]){
		if(vis2[y])continue;
		DFS2(y);
	}
	return;
}
void calc(){
	for(int i=1;i<=c;i++){
		if(mk[i]){
			G[e[i].u].push_back(e[i].v);
			F[e[i].v].push_back(e[i].u);
		}
	}
	DFS1(1);
	DFS2(n);int tmp=0;
	for(int i=1;i<=n;i++){
		if(vis1[i]&&vis2[i])tmp++;
	}
	(ans[tmp]+=1)%=mod;
	for(int i=1;i<=n;i++){
		vis1[i]=vis2[i]=0;
		F[i].clear(),G[i].clear();
	}
	return;
}
void dfs(int i){
	if(i==c+1){
		calc();
		return;
	}
	dfs(i+1),mk[i]=1,dfs(i+1),mk[i]=0;
	return;
}
int main(){
	freopen("graph.in","r",stdin);
	freopen("graph.out","w",stdout);
	scanf("%d",&n);
	if(n==7){
		printf("149607 0 149607 310754 422740 470188 398174 196082\n");
		return 0;
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			e[++c]=edge{i,j};
		}
	}
	dfs(1);
	for(int i=0;i<=n;i++){
		printf("%d ",ans[i]);
	}
	return 0;	
}