题解 hdu 1269 迷宫城堡
找点图论练习题写,发现hdu又寄了,那就发到blog里吧。
思路:tarjan缩点判断DAG中点数是否为1。若是,则该图为强连通图。
//produced by miya555 //stupid mistakes:多测记得清空 //ideas:tarjan模板 #include<bits/stdc++.h> using namespace std; const int N=10010; int n,m,low[N],ne[N],h[N],idx,top; int timestamp,dfn[N],st[N],ins[N],cnt,now,vis[N],e[N]; void add(int a,int b){ e[idx]=b; ne[idx]=h[a]; h[a]=idx++; } void tarjan(int u){ low[u]=dfn[u]=++timestamp; st[++top]=u; ins[u] = 1; for(int i=h[u];i;i=ne[i]){ int j=e[i]; if(!dfn[j]){ tarjan(j); low[u]=min(low[u],low[j]); }else if(ins[j]){ low[u]=min(low[u],dfn[j]); } } if(low[u]==dfn[u]){ cnt++; while(1) { int now = st[top]; top--; vis[now]=0; if(now == u) break; } } } int a,b; int main(){ while(~scanf("%d%d",&n,&m)){ //cin>>n>>m; if(n == 0 && m == 0) break; memset(h,0,sizeof h); memset(vis,0,sizeof vis); memset(st,0,sizeof st); for(int i = 1; i<=n; i++) dfn[i] = low[i] = 0; for(int i = 1; i<=m; i++) { cin>>a>>b; add(a,b); } for(int i = 1; i<=n; i++) { if(dfn[i] == 0) tarjan(i); } if(cnt == 1) puts("yes"); else puts("no"); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话