HDU 6165 FFF at Valentine(强连通分量+拓扑排序)
2018-02-10 16:51
621 查看
Description
给出一张nn个点mm条边的有向图,无重边无自环,问对于任意两点,是否存在一条路径从一个点到达另一个点
Input
第一行一整数TT表示用例组数,每组用例首先输入两个整数n,mn,m表示点数和边数,之后mm行每行输入两个整数u,vu,v表示uu到vv有一条有向边(1≤T≤120,2≤n≤1000,1≤m≤6000)(1≤T≤120,2≤n≤1000,1≤m≤6000)
Output
对于每组用例,如果对于任意两点,都存在一条路径可以一个点到另一个点,则输出"I love you my love and our love save us!""I love you my love and our love save us!",否则输出"Light my fire!""Light my fire!"
Sample Input
3
5 5
1 2
2 3
2 4
3 5
4 5
3 3
1 2
2 3
3 1
5 5
1 2
2 3
3 1
3 4
4 5
Sample Output
Light my fire!
I love you my love and our love save us!
I love you my love and our love save us!
Solution
首先用TarjanTarjan求强连通分量,之后对连通块求拓扑序,如果某层有超过一个点入度为00,说明该层选出两个点,其代表的连通块内分别选一点是无法互达的,即不合法,否则合法
Code
给出一张nn个点mm条边的有向图,无重边无自环,问对于任意两点,是否存在一条路径从一个点到达另一个点
Input
第一行一整数TT表示用例组数,每组用例首先输入两个整数n,mn,m表示点数和边数,之后mm行每行输入两个整数u,vu,v表示uu到vv有一条有向边(1≤T≤120,2≤n≤1000,1≤m≤6000)(1≤T≤120,2≤n≤1000,1≤m≤6000)
Output
对于每组用例,如果对于任意两点,都存在一条路径可以一个点到另一个点,则输出"I love you my love and our love save us!""I love you my love and our love save us!",否则输出"Light my fire!""Light my fire!"
Sample Input
3
5 5
1 2
2 3
2 4
3 5
4 5
3 3
1 2
2 3
3 1
5 5
1 2
2 3
3 1
3 4
4 5
Sample Output
Light my fire!
I love you my love and our love save us!
I love you my love and our love save us!
Solution
首先用TarjanTarjan求强连通分量,之后对连通块求拓扑序,如果某层有超过一个点入度为00,说明该层选出两个点,其代表的连通块内分别选一点是无法互达的,即不合法,否则合法
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> #include<stack> using namespace std; typedef long long ll; typedef pair<int,int>P; #define maxn 1005 vector<int>g[maxn],gg[maxn]; stack<int>st; int T,n,m,scc,index; int low[maxn],dfn[maxn],instack[maxn],fa[maxn]; void init()//初始化 { scc=index=0; while(!st.empty())st.pop(); for(int i=0;i<maxn;i++)g[i].clear(); memset(dfn,0,sizeof(dfn)); memset(instack,0,sizeof(instack)); memset(low,0,sizeof(low)); } void add(int u,int v)//建u到v的单向边 { g[u].push_back(v); } void tarjan(int u)//求强联通分量 { dfn[u]=low[u]=++index; instack[u]=1; st.push(u); int v,size=g[u].size(); for(int i=0;i<size;i++) { v=g[u][i]; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { scc++; do { v=st.top(); st.pop(); fa[v]=scc; instack[v]=0; }while(v!=u); } } void solve() { for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); } int deg[maxn]; bool check() { for(int i=1;i<=scc;i++)gg[i].clear(); memset(deg,0,sizeof(deg)); for(int i=1;i<=n;i++) for(int j=0;j<g[i].size();j++) { int v=g[i][j]; if(fa[i]!=fa[v]) gg[fa[i]].push_back(fa[v]),deg[fa[v]]++; } queue<int>que; for(int i=1;i<=scc;i++) if(!deg[i])que.push(i); while(!que.empty()) { if(que.size()>1)return 0; int u=que.front();que.pop(); for(int i=0;i<gg[u].size();i++) { int v=gg[u][i]; deg[v]--; if(!deg[v])que.push(v); } } return 1; } int main() { scanf("%d",&T); while(T--) { init(); scanf("%d%d",&n,&m); while(m--) { int u,v; scanf("%d%d",&u,&v); add(u,v); } solve(); if(check())printf("I love you my love and our love save us!\n"); else printf("Light my fire!\n"); } return 0; }
相关文章推荐
- HDU 6165 FFF at Valentine
- hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
- HDU - 6165 FFF at Valentine
- hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
- 2017多校九 05题 hdu 6165 FFF at Valentine 缩点 dp找最长链/拓扑排序
- hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
- HDU 6165 FFF at Valentine(tarjan缩点+拓扑排序)
- hdu 6165 FFF at Valentine
- hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
- hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
- [HDU 6165]FFF at Valentine
- HDU-6165 FFF at Valentine - 2017 Multi-University Training Contest - Team 9(强连通分量缩点+拓扑)
- 【多校训练】hdu 6165 FFF at Valentine
- HDU 6165 FFF at Valentine (tarjan缩点+拓扑判任意两点联通)
- hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
- HDU-6165-FFF at Valentine
- HDU 6165 FFF at Valentine
- hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
- HDU 6165 FFF at Valentine -单向连通图
- HDU --- 6165 FFF at Valentine 多校第九场 【强联通缩点 + 维护拓扑序】