| 比赛 |
期末考试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;
}