HDU 6165 FFF at Valentine(强连通 缩点 17多校第九场)
来源:互联网 发布:emlog源码下载 编辑:程序博客网 时间:2024/06/05 17:07
题目大意
给定一个又向图,让你判断是否是对于给定的任意两个点都能从u到v或v到u
分析
缩点成DAG之后,不断删掉度为0的点,如果某个时刻出现两个或以上入度为0的点则不满足
算法的实现采用的是Tarjan算法求强连通分量缩点代码
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<queue>#include<map>#include<algorithm>#include<set>#include<stack>using namespace std;const int MAXN=1005;int T;int n,m;int DFN[MAXN];int LOW[MAXN];int vis[MAXN];int belong[MAXN];//belong[i]表示i属于缩点后的哪个节点int cnt;//缩点后的点数int tot;int in[MAXN];//保存缩点后每个点的入度int graph[MAXN][MAXN];struct Edge{ int v; int next;}edge[MAXN*MAXN];int edgecount;int head[MAXN];void Init(){ edgecount=0; memset(head,-1,sizeof(head)); memset(graph,0,sizeof(graph));}void Add_edge(int u,int v){ edge[++edgecount].v=v; edge[edgecount].next=head[u]; head[u]=edgecount;}stack<int > St;void Tarjan(int u)//从节点x开始搜索{ DFN[u]=LOW[u]=++tot; vis[u]=1;//为1表示在队列里面 St.push(u); for(int k=head[u];k!=-1;k=edge[k].next) { int v=edge[k].v; if(!DFN[v])//还未访问过 { Tarjan(v); LOW[u]=min(LOW[u],LOW[v]); } else if(vis[v])//被访问过,还在队列里 { LOW[u]=min(LOW[u],DFN[v]); } } if(LOW[u]==DFN[u]) { int x; ++cnt; while(1) { x=St.top(); St.pop(); vis[x]=0; belong[x]=cnt; if(x==u)break; } }}bool Topo(){ int bj[MAXN]; memset(bj,0,sizeof(bj)); for(int k=1;k<=cnt;k++) { int sum=0; int x; for(int v=1;v<=cnt;v++) { if(in[v]==0 && bj[v]==0){sum++;x=v;} } if(sum>=2)return 0; bj[x]=1; for(int v=1;v<=cnt;v++) { if(graph[x][v]==1)in[v]--; } } return 1;}void Solve(){ tot=0; cnt=0;//缩点后的点数 memset(DFN,0,sizeof(DFN)); memset(LOW,0,sizeof(LOW)); memset(vis,0,sizeof(vis)); memset(in,0,sizeof(in)); while(!St.empty()) St.pop(); for(int i=1;i<=n;i++) { if(DFN[i]==0)Tarjan(i); } for(int u=1;u<=n;u++) { for(int k=head[u];k!=-1;k=edge[k].next) { int v=edge[k].v; if(belong[u]!=belong[v]) { if(graph[belong[u]][belong[v]]==0)in[belong[v]]++; graph[belong[u]][belong[v]]=1; } } } //Test(); if(Topo())printf("I love you my love and our love save us!\n"); else printf("Light my fire!\n");}void In(){ int a,b; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); Add_edge(a,b); }}int main(){ //freopen("in.txt","r",stdin); //freopen("out1.txt","w",stdout); scanf("%d",&T); while(T--) { Init(); In(); Solve(); } return 0;}/*208 111 24 85 82 44 12 62 53 65 74 53 1*/
阅读全文
0 0
- HDU 6165 FFF at Valentine(强连通 缩点 17多校第九场)
- HDU --- 6165 FFF at Valentine 多校第九场 【强联通缩点 + 维护拓扑序】
- hdu 6165 FFF at Valentine(强连通分量缩点+dfs)
- 文章标题 HDU 6165: FFF at Valentine(强连通分量缩点)
- hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
- 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(tarjan缩点+拓扑排序)
- 2017年多校赛第九场 1005 FFF at Valentine(缩点+拓扑排序)
- hdu6165 FFF at Valentine【强联通缩点+拓扑排序】
- hdu6165 FFF at Valentine 强联通缩点
- HDU 6165 FFF at Valentine -单向连通图
- hdu6165 FFF at Valentine 2017多校第九场1005 dfs
- HDU 6165 FFF at Valentine
- HDU-6165 FFF at Valentine
- HDU 6165 FFF at Valentine
- node.js 用户上传图片到服务器
- Use varargs judiciously
- [中等] 堆优化的Dijkstra实现
- 自定义View之视差特效
- 为什么要源码编译
- HDU 6165 FFF at Valentine(强连通 缩点 17多校第九场)
- iOS进阶之巧用IBInspectable属性和IB_DESIGNABLE宏定义
- linux系统性安装mysql服务器(基于CentOS)
- HTML&CSS基础篇之十五:表格&列表
- 【POJ】2362 Square(DFS)
- 完整css选择器总结
- 1010:“水仙花数”问题1
- libsvm正则化和liblinear正则化的区分
- 我的工作——认知