個人專題一 強連通 Poj 2186

2021-05-27 08:39:42 字數 2636 閱讀 5203

思路1**:

#include#include//#includeusing namespace std;

//儲存變數

int x,y;

vectorf[10000];//儲存正向圖

vectorn[10000];//儲存反向圖

bool sign[10000];

//輔助變數

int i,g,h,sum,r;

void init()

}int doit()

dotset[edgemax*3];//直接申請好全部空間,然後哪個空間放哪個節點臨時生成即可

int count=0;//每乙個case後,count置為0

node *newnode()//呼叫上面申請好的全部空間裡的乙個節點作為儲存地點

void addnode(node hash,int a,int b)//在相連表上插入乙個節點

node hash[dotmax];

node nhash[dotmax];

node new[dotmax];

int gcc;

int order[dotmax];

int num;

int id[dotmax];

int visit[dotmax];

int gccnum[dotmax];

void init(node hash,int n)//初始化相連表

}int n,m;

void dfs(int u)//正向圖中深搜

}num++;

order[num]=u;//用於反向搜尋的順序,可避免排序從而提高效率

}void ndfs(int u)//反向圖中搜尋

}}int main()

memset(visit,0,sizeof(visit));

num=0;

//正向深搜,找到根節點

for(i=1;i<=n;i++)

memset(visit,0,sizeof(visit));

gcc=0;

//反向深搜

for(i=num;i>=1;i--)

}for(i=1;i<=n;i++)}}

int cnt=0;

memset(gccnum,0,sizeof(gccnum));

for(i=1;i<=n;i++)

gccnum[id[i]]++;//各連通子圖中的頂點個數

int mark=0;

for(i=1;i<=gcc;i++)//搜尋gcc個子圖(視為頂點)

}if(cnt==1) //如果出度為0的只有乙個,該連通子圖的個數即所求個數

printf("%d\n",gccnum[mark]);

else//無結果

printf("%d\n",0);

}return 0;}

自己照思路2敲了一遍。。(344ms)

#include#includestruct nodehash[10001],nhash[10001],newhash[10001];

bool isvisit[10001];

int n,m,order[10001],sum,setnum[10001],num[10001],setnum;//sum代表已經訪問結束的頂點個數

void init(int n)//初始化

void addnode(struct node thash,int tstt,int tend)//新增節點

void dfs(int x)

order[++sum]=x;

}void ndfs(int x)

}int main()

for(i=1;i<=n;i++)

}memset(isvisit,false,sizeof(isvisit));

for(i=n;i>0;i--)

}for(i=1;i<=n;i++)

}int hole=0,k;

for(i=1;i<=setnum;i++)

}if(hole==1) printf("%d\n",num[k]);

else printf("0\n");

} return 0;

}

思路1:

1、在反向圖中深搜,找到「根節點」(最後結束的是「根節點」),然後在反向圖中深搜「根節點」,如果能遍歷全部頂點,則該點並是反向圖中的根節點,也就是受所有牛歡迎的牛,轉到2。否則輸出0,結束。

2、 和該根節點的牛在同一強連通子圖的牛也是受全部牛歡迎的牛。這裡只要在正向圖中深搜根節點,記錄搜尋到的數目,就是我們要的輸出。

思路2:

1、在正向圖中深搜,形成森林,記錄各個節點的結束時間。

2、按時間從大到小在反向圖中深搜,深搜未中斷前,給每個被搜頂點記錄相同且唯一的數字,代表屬於同乙個強連通子圖(以上為kosaraju演算法)

3、利用強連通子圖構建新圖(此時必定無環,有環的已經屬於同乙個強連通子圖而縮為新圖的乙個頂點

4、如果新圖中出度為0的節點有多個,則返回0。否則返回出度為0的那個強連通子圖中頂點的個數。

(思路2的**來自不過我加了注釋,需要吸收的是相連錶用vector建立十分耗時,此外思路2的找強連通子圖的做法在深搜完後不用排序即可立即進行反向搜尋(可能已經很通用,只是我剛學,自己的思路是要排序,呵呵)

poj 2186 強連通縮點

題意 有n只奶牛,奶牛有自己認為最受歡迎的奶牛。奶牛們的這種 認為 是單向可傳遞的,當a認為b最受歡迎 b不一定認為a最受歡迎 且b認為c最受歡迎時,a一定也認為c最受歡迎。現在給出m對這樣的 認為.的關係,問有多少只奶牛被除其本身以外的所有奶牛關注。思路 既然有單向傳遞關係,那麼關係圖可能就形成了...

POJ 2186 強連通分量

比較簡單吧。套模板。gabow include cstdlib include cctype include cstring include cstdio include cmath include algorithm include vector include string include io...

Poj 2186 強連通分量

題目大意 分析題解 個人 view code 1 10180085 perseawe 2186 accepted 1424k 79ms pascal 2645b 2012 05 10 19 54 27 23 var 4 n,m,tot,numofblocks,time,top longint 5 d...