一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意
两点u,v,存在一条u到v的有向路径或者从v到u的有向路径。若G'=(V',E')满足V'?V,E'是E中所有跟V'有关的边,
则称G'是G的一个导出子图。若G'是G的导出子图,且G'半连通,则称G'为G的半连通子图。若G'是G所有半连通子图
中包含节点数最多的,则称G'是G的最大半连通子图。给定一个有向图G,请求出G的最大半连通子图拥有的节点数K
,以及不同的最大半连通子图的数目C。由于C可能比较大,仅要求输出C对X的余数。
解法:把scc缩点,同一个连通分量里肯定互相可达,然后变成了dag,只需要跑一个dag上dp找最长路即可,然后需要记录一下最长路方案数,需要注意的确定点之后边就确定了,所以scc缩点时需要判一下重边
/**************************************************************Problem: 1093User: walfyLanguage: C++Result: AcceptedTime:4788 msMemory:49420 kb
****************************************************************///#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m&#43;1,r,rt<<1|1
#define pil pair
#define pli pair
#define pii pair
#define cd complex
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0)using namespace std;const double g&#61;10.0,eps&#61;1e-11;
const int N&#61;100000&#43;10,maxn&#61;1000000&#43;10,inf&#61;0x3f3f3f3f,INF&#61;0x3f3f3f3f3f3f3f3f;int n,m,X;
stack<int>s;
vector<int>v[N],vv[N],ans[N];
int dfn[N],low[N];
int ins[N],inans[N];
int num,ind;
int a[maxn],b[maxn];
void tarjan(int u)
{ins[u]&#61;2;low[u]&#61;dfn[u]&#61;&#43;&#43;ind;s.push(u);for(int i&#61;0;i
}
map
void scc()
{for(int i&#61;1;i<&#61;n;i&#43;&#43;)if(!dfn[i])tarjan(i);for(int i&#61;0;i
}
pii dp[N];
pii DP(int u)
{if(dp[u].fi!&#61;-1)return dp[u];dp[u].fi&#61;ans[u].size(),dp[u].se&#61;1;for(int i&#61;0;i
// printf("%d %d %d %d\n",u,x,dp[u].fi,dp[u].se);
}else if(dp[u].fi&#61;&#61;te.fi&#43;ans[u].size()){dp[u].se&#61;(dp[u].se&#43;te.se)%X;
// printf("%d %d %d &#43;&#43;&#43;%d\n",u,x,dp[u].se,te.se);
}}return dp[u];
}
int main()
{scanf("%d%d%d",&n,&m,&X);for(int i&#61;0;i
}
/**********************************************/