# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
636225 | amirhoseinfar1385 | Subtree (INOI20_subtree) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
long long n,m;
vector<vector<long long>>adj;
vector<long long>par;
vector<long long>vaz;
vector<long long>res,resa[2][2],we;
vector<bool>vis;
long long mod=1e9+7;
void solvef(long long u){
if(we[u]!=0){
vaz[u]=1;
}
vis[u]=1;
vector<long long>adja;
for(int i=0;i<adj[u].size();i++){
if(vis[adj[u][i]]==0){
adja.push_back(adj[u][i]);
}
}
adj[u]=adja;
long long counta=0;
adja.clear();
for(int i=0;i<adj[u].size();i++){
counta++;
we[adj[u][i]]++;
}
for(int i=0;i<adj[u].size();i++){
if(vis[adj[u][i]]==0){
we[adj[u][i]]--;
counta--;
solvef(adj[u][i]);
adja.push_back(adj[u][i]);
if(we[adj[u][i]]>0){
swap(adja[0],adja.back());
}
}
}
if(counta!=0){
vaz[u]=2;
}
we[u]-=counta;
adj[u]=adja;
}
void solves(long long u){
vis[u]=1;
for(int i=0;i<adj[u].size();i++){
solves(adj[u][i]);
}
if(vaz[u]==1){
for(int i=0;i<adj[u].size();i++){
res[u]*=res[adj[u][i]]+1;
res[u]%=mod;
}
resa[1][0][u]=res[u];
res[0][1][u]=1;
return ;
}
if(vaz[u]==0){
for(int i=0;i<adj[u].size();i++){
res[u]*=res[adj[u][i]]+1;
res[u]%=mod;
}
for(int i=0;i<adj[u].size();i++){
if(i==0){
resa[1][0][u]+=resa[1][0][adj[u][i]];
resa[1][1][u]+=resa[1][1][adj[u][i]]+resa[0][1][adj[u][i]];
resa[0][1][u]+=resa[1][0][adj[u][i]]+resa[0][1][adj[u][i]];
resa[1][0][u]%=mod;
resa[1][1][u]%=mod;
resa[0][1][u]%=mod;
continue;
}
resa[1][1][u]*=res[adj[u][i]]+1;
resa[1][1][u]%=mod;
resa[1][0][u]*=res[adj[u][i]]+1;
resa[1][0][u]%=mod;
resa[0][1][u]*=res[adj[u][i]]+1;
resa[0][1][u]%=mod;
}
return ;
}
if(vaz[u]==2){
res[u]--;
for(int i=0;i<adj[u].size();i++){
if(i==0){
res[u]+=resa[1][1][adj[u][i]]+resa[0][1][adj[u][i]];
res[u]%=mod;
continue;
}
res[u]*=res[adj[u][i]]+1;
res[u]%=mod;
}
res[u]++;
res[u]%=mod;
return ;
}
}
int main(){
cin>>n>>m;
adj.resize(n+1);
par.resize(n+1);
vis.resize(n+1);
vaz.resize(n+1);
res.resize(n+1,1);
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
resa[i][j].resize(n+1);
}
}
we.resize(n+1);
for(int i=0;i<m;i++){
long long u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
solvef(1);
solves(1);
long long mainres=0;
for(int i=1;i<=n;i++){
// cout<<i<<" "<<res[i]<<" "<<resa[1][0][i]<<" "<<resa[1][1][i]<<" "<<resa[0][1][i]<<" "<<vaz[i]<<endl;
mainres+=res[i];
mainres%=mod;
}
cout<<mainres<<endl;
}