文章目录
Poj-3694-Network
题目大意
给你一个n个节点m条边的连通图,问你每次给所选的两个点连线后,该连通图还有多少个桥。
解题思路
我们先用Tarjan进行缩点,然后统计出现在还有多少个桥,对于缩完点后的数,我们找一个点做祖先没然后每次的答案就是现有的桥数减去他们最近公共祖先的距离和-1。我们每次操作完后需要给所连接成一个环的节点全部归为一个节点。
还有就是这个题,用邻接表存图会TLE的,需要链式前项星,并且有重边
代码
#include<vector>
#include<stdio.h>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int mx=1000100;
int dfn[mx],low[mx];
bool vis[mx];
int col[mx];
int pre[mx],father[mx];
int deep[mx];
int stt[mx];
int top=0;
int n,m,cnt,sum;
int tot,tot2;
int head[mx],head2[mx];
struct node{
int ne,to;
} ve[mx],vec[mx];
void tarjan(int x,int fa){
dfn[x]=low[x]= ++cnt;
vis[x]=1;
stt[top++]=x;
int flag=0;//判断是否有重边
for(int i=head[x];~i;i=ve[i].ne){
int v=ve[i].to;
if(!dfn[v]){
tarjan(v,x);
low