日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图的割点(边表集实现)

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的割点(边表集实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
? ? Name: 圖的割點(邊表集實現)
? ? Copyright:?
? ? Author: 巧若拙?
? ? Date: 20-11-14 21:17
? ? Description:?
? ? 在一個無向連通圖中。假設有一個頂點集合,刪除這個頂點集合。以及這個集合中全部頂點相關聯的邊以后,原圖變成多個連通塊,就稱這個點集為割點集合。
求割點與橋的算法是R.Tarjan發明的。對圖深度優先搜索。定義DFS(u)為u在搜索樹(下面簡稱為樹)中被遍歷到的次序號(等價于時間戳)。
定義Low(u)為u或u的子樹中能通過非父子邊追溯到的最早的節點。即DFS序號最小的節點的序號。

依據定義,則有: ?
Low(u)=Min { DFS(u) ,DFS(v)},當中 (u,v)為后向邊(返祖邊) 等價于 DFS(v)<DFS(u)且v不為u的父親節點 Low(v) (u,v)為樹枝邊(父子邊)?
一個頂點u是割點。當且僅當滿足(1)或(2) :
(1) u為樹根。且u有多于一個子樹。?
(2) u不為樹根。且滿足存在(u,v)為樹枝邊(或稱父子邊,即u為v在搜索樹中的父親),使得DFS(u)<=Low(v)。


本文用邊表集存儲圖的信息,實現了遞歸和非遞歸兩種算法。

?
*/
#include<stdio.h>
#include<stdlib.h>


#define MAXN 26 ? //最大變量(頂點)數量?
#define MAXM 100000 ? //最大關系式數量?


typedef char VertexType; //頂點類型由用戶自己定義
typedef int EdgeType; //邊上的權值類型由用戶自己定義


typedef struct Edge{ //邊集數組?
? ? int u, v; //弧尾和弧頭?
? ? int next; //指向同一個弧尾的下一條邊?
// ? ?EdgeType weight; //權值,對于非網圖能夠不須要?
} EdgeLib;


EdgeLib edge[MAXM]; //存儲邊信息
int first[MAXN]; //指向頂點的第一條邊
int flag[MAXN] = {0}; //存儲頂點是否為割點?
int num[MAXN] = {0}; //存儲頂點的時間戳信息?
int low[MAXN] = {0}; //存儲頂點的最小時間戳信息?
int index = 0; //用來進行時間戳的遞增?


void CreateGraph(int n, int m);//創建一個圖
void PrintGraph(int n, int m);//輸出圖
void CutPoint_DFS(int root, int cur, int father);//採用深度優先搜索尋找割點(遞歸算法)?
void CutPoint(int root, int n);//採用深度優先搜索尋找割點(非遞歸算法)?


int main()
{
? ? int i, m, n;
? ??
? ? printf("請輸入頂點數量和邊數量:\n");?
? ? scanf("%d%d", &n, &m); ? ?
? ??
? ? CreateGraph(n, m);//創建一個圖
? ? PrintGraph(n, m);//輸出圖
? ??
?// ? CutPoint_DFS(0, 0, 0);//從0號頂點開始深度優先搜索尋找割點(遞歸算法)?
? ? CutPoint(0, n);?


? ? printf("\n割點為:");?
? ? for (i=0; i<n; i++)//輸出全部割點
? ? {
? ? ? ? if (flag[i] == 1)
? ? ? ? ? ? printf("%d ", i);
? ? }?
? ? printf("\n");
? ??
? ? return 0;
}


void CreateGraph(int n, int m)//創建一個圖
{
? ? int i;
? ??
? ? for (i=0; i<n; i++)//初始化圖?
? ? {
? ? ? ? first[i] = -1;
? ? ? ? num[i] = low[i] = flag[i] = 0;
? ? }
? ??
? ? for (i=0; i<m+m; i+=2) ?//讀入邊信息(注意是無向圖)?
? ? {
? ? ? ? scanf("%d%d", &edge[i].u, &edge[i].v);
? ? ? ? edge[i].next = first[edge[i].u];
? ? ? ? first[edge[i].u] = i;
? ? ? ??
? ? ? ? edge[i+1].u = edge[i].v;
? ? ? ? edge[i+1].v = edge[i].u;
? ? ? ? edge[i+1].next = first[edge[i+1].u];
? ? ? ? first[edge[i+1].u] = i + 1;
? ? }
}?


void PrintGraph(int n, int m)//輸出圖
{
? ? int i, j;
? ??
? ? for (i=0; i<n; i++)
? ? {
? ? ? ? printf("%d: ", i);
? ? ? ? j = first[i]; //指向i的第一條邊?
? ? ? ? while (j != -1)
? ? ? ? {
? ? ? ? ? ? printf("<%d, %d>, ", edge[j].u, edge[j].v);
? ? ? ? ? ? j = edge[j].next; //指向下一條邊?
? ? ? ? }
? ? ? ? printf("\n");
? ? }
? ? printf("\n");
}?


void CutPoint_DFS(int root, int cur, int father)//採用深度優先搜索尋找割點(遞歸算法)?
{
? ? int k, child = 0;
? ??
? ? num[cur] = low[cur] = ++index;
? ? k = first[cur];
? ? while (k != -1)
? ? {
? ? ? ? if (num[edge[k].v] == 0) //新結點做兒子
? ? ? ? {
? ? ? ? ? ? child++;
? ? ? ? ? ? CutPoint_DFS(root, edge[k].v, cur);
? ? ? ? ? ??
? ? ? ? ? ? low[cur] = (low[cur] < low[edge[k].v]) ? low[cur] : low[edge[k].v];//取最小值?
? ? ? ? ? ??
? ? ? ? ? ? if ((cur != root && num[cur] <= low[edge[k].v])
? ? ? ? ? ? ?|| (cur == root && child == 2))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? flag[cur] = 1;
? ? ? ? ? ? }
? ? ? ? }?
? ? ? ? else if (edge[k].v != father) //與旁系祖先有連接,事實上也能夠不加這個限制條件,由于假設父親是自己則low[cur]值不變?
? ? ? ? {
? ? ? ? ? ? low[cur] = (low[cur] < num[edge[k].v]) ?

low[cur] : num[edge[k].v];//取最小值?
? ? ? ? }?
? ? ? ??
? ? ? ? k = edge[k].next;
? ? }
}


void CutPoint(int root, int n)//採用深度優先搜索尋找割點(非遞歸算法)?
{
? ? int Stack[MAXN]; //用來存儲當前被處理頂點的棧?
? ? int SF[MAXN]; //指向頂點的第一條未搜索邊
? ? int child[MAXN] = {0}; //存儲頂點的兒子數量?
? ? int k, u, v, top = 0;
? ??
? ? for (u=0; u<n; u++)//初始化SF?
? ? ? ? SF[u] = first[u];
? ? ? ??
? ? Stack[top] = root;
? ? num[root] = low[root] = ++index;
? ? while (top >= 0)
? ? {
? ? ? ? k = SF[Stack[top]];
? ? ? ? if (k != -1)
? ? ? ? {
? ? ? ? SF[Stack[top]] = edge[k].next; //指向下一條邊?
? ? ? ? ? ? if (num[edge[k].v] == 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? child[Stack[top]]++;
? ? ? ? ? ? ? ? Stack[++top] = edge[k].v;
? ? ? ? ? ? ? ? low[edge[k].v] = num[edge[k].v] = ++index;
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? low[Stack[top]] = (low[Stack[top]] < num[edge[k].v]) ? low[Stack[top]] : num[edge[k].v];//取最小值
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? if (top > 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? u = Stack[top-1];
? ? ? ? ? ? ? ? v = Stack[top];
? ? ? ? ? ? ? ? low[u] = (low[u] < low[v]) ? low[u] : low[v];
? ? ? ? ? ? ? ? if ((u != root && low[v] >= num[u])
? ? ? ? ? ? ? ? ?|| (u == root && child[u] == 2))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? flag[u] = 1;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? top--;
? ? ? ? }
? ? } ? ? ? ?
}

總結

以上是生活随笔為你收集整理的图的割点(边表集实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费av一区 | 欧美在线天堂 | 亚洲中文字幕一区二区在线观看 | 性调教学院高h学校 | 国产美女白浆 | 国产小视频你懂的 | 麻豆传媒在线播放 | 久久久国产精华液 | 女人洗澡一级特黄毛片 | 银娇在线观看 | www.99视频| 波多野结衣在线观看一区二区 | 美女黄视频在线观看 | 亚洲免费视频网 | 日韩三区视频 | 国产乱强伦一区二区三区 | 蜜桃成人av | 在线观看成人免费 | 午夜视频在线观看一区二区 | 国产成人精品一区二区三区视频 | 欧美福利专区 | 99re在线视频播放 | 性一交一乱一色一视频麻豆 | 成年精品 | 国产精品成人一区二区网站软件 | 欧美色插 | 午夜在线 | 另类视频一区 | 少妇黄色一级片 | aaa一级黄色片 | 日本偷拍一区 | 91九色国产ts另类人妖 | 天天看夜夜看 | 久久久夜夜 | 伊人96| 黄av在线| 中文在线日本 | 色播放| 免费黄网站在线看 | av网站免费大全 | 国产精品成人久久久 | 欧美射射| 日韩黄色a级片 | 亚洲综合在线观看视频 | 天天插天天操天天干 | av免费片| 免费在线看黄网址 | 8x8ⅹ国产精品一区二区二区 | 少妇一级淫片日本 | 办公室荡乳欲伦交换bd电影 | 在线免费观看av网站 | 国产91黄色 | 国产一区高清 | 特级丰满少妇一级aaa爱毛片 | 日韩精品视频免费在线观看 | 成年人黄色片网站 | 日韩欧美中文字幕一区 | 亚洲成人黄色av | 91热爆在线| 亚洲国产精品免费 | 草莓视频在线观看入口w | 悟空影视大全免费高清观看在线 | 黑丝美女av | 免费在线观看黄色网址 | 中国一级片黄色一级片黄 | 亚洲高清在线视频 | 特黄视频 | 日本国产亚洲 | 在线看免费av| 国产高潮国产高潮久久久91 | 真实新婚偷拍xxxxx | 欧美激情性做爰免费视频 | 国产人妖在线视频 | 天天干导航 | 波多野结衣三区 | 在线一区 | 天天色图片| 国产乱码精品一区二区三区不卡 | 日本久久综合 | 一区成人 | 污污网站在线看 | 男女插插插网站 | 一级黄色片欧美 | 我们俩电影网mp4动漫官网 | 国产亚洲欧美精品久久久www | 亚洲综合国产精品 | 色涩久久 | 免费色片网站 | 91丨porny丨尤物| 岛国av中文字幕 | 欧美久久伊人 | 日韩av一卡二卡 | 黄色1级大片 | 黄色录像三级 | 欧美性猛交xxxx乱 | 日批网站在线观看 | 一二三区中文字幕 | 国产有码| av每日更新在线观看 |