- <span style="font-size:14px;">struct node
- {
- int y,pre,i;//增加一个i是考虑重边的情况的
- };
- node a[N];
- int pre[N],sign[N];
- int dfn[N],low[N];
- int tot,lenn;
- int n,m,len;
- void init()
- {
- memset(pre,-1,sizeof(pre));
- memset(sign,false,sizeof(sign));
- len=1;tot=1;
- }
- void addpage(int s,int t,int i)
- {
- a[len].y=t;
- a[len].pre=pre[s];
- a[len].i=i;
- pre[s]=len++;
- }
- void dfs(int x,int s)
- {
- dfn[x]=low[x]=tot++;
- sign[x]=true;
- for(int i=pre[x]; i!=-1; i=a[i].pre)
- {
- int y=a[i].y;
- if(a[i].i==s) continue;
- if(!sign[y])
- {
- dfs(y,a[i].i);
- low[x]=min(low[x],low[y]);
- }
- else low[x]=min(low[x],low[y]);
- }
- }
- int main()
- {
- init();
- repf(i,1,n)
- if(!sign[i])
- dfs(i,-1);//其中-1是代表的边的
- return 0;
- }
- 对于边x~y,如果low[x]>dfn[y]||low[y]>dfn[x]即为割边
- 对于点u是图的割点当切仅当u存在一个字节点v.使得low[v]>=dfn[u]</span>
割点和割边
最新推荐文章于 2022-12-31 10:26:59 发布