洛谷P1656 炸铁路
题目大意:炸毁一条道路使图不连通
题解:tarjian求割边
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define maxn 5202 using namespace std; int n,m,sumedge,tim,cnt; int head[maxn],low[maxn],dfn[maxn]; struct Ans{ int x,y; }ans[maxn]; struct Edge{ int x,y,nxt; Edge(int x=0,int y=0,int nxt=0): x(x),y(y),nxt(nxt){} }edge[maxn<<1]; void add(int x,int y){ edge[++sumedge]=Edge(x,y,head[x]); head[x]=sumedge; } bool cmp(Ans a,Ans b){ if(a.x!=b.x)return a.x<b.x; return a.y<b.y; } void Tarjian(int x,int fa){ low[x]=dfn[x]=++tim; for(int i=head[x];i;i=edge[i].nxt){ int v=edge[i].y; if(v==fa)continue; if(!dfn[v]){ Tarjian(v,x); low[x]=min(low[x],low[v]); if(low[v]>dfn[x])ans[++cnt].x=x,ans[cnt].y=v; }else low[x]=min(low[x],dfn[v]); } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); add(x,y);add(y,x); } for(int i=1;i<=n;i++) if(!dfn[i])Tarjian(i,i); sort(ans+1,ans+cnt+1,cmp); for(int i=1;i<=cnt;i++) printf("%d %d\n",ans[i].x,ans[i].y); return 0; }
分类:
图论—强连通/tarjian
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?