博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1515 Street Directions
阅读量:5086 次
发布时间:2019-06-13

本文共 1275 字,大约阅读时间需要 4 分钟。

题意:

一幅无向图  将尽量多的无向边定向成有向边  使得图强连通  无向图保证是连通的且没有重边

思路:

桥必须是双向的  因此先求边双连通分量  并将桥保存在ans中

每一个双连通分量内的边一定都能够变成有向边(毕竟是圈组成的图) 边的定向方式分两种:

1、对于树枝边u->v  假设low[v]>dfn[u]说明v回不到u上面去  所以ans应该是v->u的边  否则是u->v

2、对于逆向边  应该全在ans中  由于对于dfs树而言  这样的边利于low减小

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;#define N 1010#define M 2000010#define inf 2147483647int n,m,t=1,tot,idx;int head[N],dfn[N],low[N];struct edge{ int u,v,next; bool vis,cut,left;}ed[M];void add(int u,int v){ ed[tot].u=u; ed[tot].v=v; ed[tot].next=head[u]; ed[tot].vis=ed[tot].cut=ed[tot].left=false; head[u]=tot++;}void tarjan(int u){ int i,v; dfn[u]=low[u]=++idx; for(i=head[u];~i;i=ed[i].next) { v=ed[i].v; if(ed[i].vis) continue; ed[i].vis=ed[i^1].vis=true; if(dfn[v]==-1) { tarjan(v); low[u]=min(low[u],low[v]); if(dfn[u]
dfn[u]) ed[i^1].left=true; else ed[i].left=true; } else { low[u]=min(low[u],dfn[v]); if(!ed[i].vis) ed[i].left=true; ed[i].vis=ed[i^1].vis=true; } }}void solve(){ int i; memset(dfn,-1,sizeof(dfn)); idx=0; tarjan(1); memset(dfn,-1,sizeof(dfn)); idx=0; for(i=0;i

转载于:https://www.cnblogs.com/bhlsheji/p/5114213.html

你可能感兴趣的文章
Spring Boot 静态资源处理
查看>>
nginx vhost配置
查看>>
Vue 爬坑之路(二)—— 组件之间的数据传递
查看>>
Mysql客户端下载地址
查看>>
Apache 2.2, PHP 5, and MySQL 5
查看>>
Atitit 列出wifi热点以及连接
查看>>
5、Django实战第5天:首页和登录页面的配置
查看>>
linux系统挂载ISO文件
查看>>
也谈设计模式,架构,框架和类库的区别
查看>>
算法入门经典大赛 Dynamic Programming
查看>>
java爬取Excel表格
查看>>
C#开发微信公众号-学习笔记
查看>>
关于HibernateTempleate模版-很多代码可以直接使用,是开发人员不可多得选择
查看>>
购物商城+ATM
查看>>
基因组共线性分析方法
查看>>
Java导包——import语句
查看>>
StringBuffer类
查看>>
20181113-1 版本控制报告
查看>>
luogu3146 [USACO16OPEN]248
查看>>
Notes of the scrum meeting(2013/10/20)
查看>>