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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

USACO network of school 强连通分量

發布時間:2025/5/22 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USACO network of school 强连通分量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  這個題的意思是有一個有向圖, 每個頂點可以發送軟件到與其相連的頂點上, 現在問1,至少發送給幾個頂點能滿足所有頂點都收到軟件, 2:如果想讓這個圖變成強連通圖,至少添幾條邊。 ?特例是給定的圖是一個強連通圖的話答案是1, 0. 一般情況下我們先將這個圖的強連通分量求出來縮成一個點然后統計入度為0的點和出度為0的點的個數, 答案一就是入度為0的點的個數, 答案就是他們兩個之間的最大值。代碼如下:

/*ID: m1500293LANG: C++PROG: schlnet */ #include <cstdio> #include <cstring> #include <algorithm> #include <vector>using namespace std; const int max_v = 120;struct Scc {int V; //圖的頂點數vector<int> G[max_v]; //原始圖vector<int> rG[max_v]; //反向邊的圖vector<int> vs; //后序遍歷頂點列表bool used[max_v]; //訪問標記int cmp[max_v]; //所屬強連通分量的拓撲排序void init(){for(int i=0; i<=V; i++) G[i].clear(), rG[i].clear();}void add_edge(int from, int to){G[from].push_back(to);rG[to].push_back(from);}void dfs(int v){used[v] = true;for(int i=0; i<G[v].size(); i++)if(!used[G[v][i]]) dfs(G[v][i]);vs.push_back(v);}void rdfs(int v, int k){used[v] = true;cmp[v] = k;for(int i=0; i<rG[v].size(); i++)if(!used[rG[v][i]]) rdfs(rG[v][i], k);}int scc(){memset(used, 0, sizeof(used));vs.clear();for(int v=1; v<=V; v++)if(!used[v]) dfs(v);memset(used, 0, sizeof(used));int k = 1;for(int i=vs.size()-1; i>=0; i--)if(!used[vs[i]]) rdfs(vs[i], k++);return k-1;} }ss; int num; //強連通分量的個數 int in[110], out[110]; int main() {freopen("schlnet.in", "r", stdin);freopen("schlnet.out", "w", stdout);int N;scanf("%d", &N);ss.V = N;ss.init();for(int i=1; i<=N; i++){int t;scanf("%d", &t);while(t != 0){ss.add_edge(i, t);scanf("%d", &t);}} // printf("%d\n", ss.scc());num = ss.scc();if(num == 1){printf("1\n0\n");return 0;}for(int u=1; u<=N; u++) //u->vfor(int j=0; j<ss.G[u].size(); j++){int v = ss.G[u][j];int uu=ss.cmp[u], vv=ss.cmp[v];if(uu != vv){in[vv]++;out[uu]++;}}int in_0_num=0, out_0_num=0;for(int i=1; i<=num; i++){if(!in[i]) in_0_num++;if(!out[i]) out_0_num++;}printf("%d\n%d\n", in_0_num, max(in_0_num, out_0_num));return 0; }

?

轉載于:https://www.cnblogs.com/xingxing1024/p/5180641.html

總結

以上是生活随笔為你收集整理的USACO network of school 强连通分量的全部內容,希望文章能夠幫你解決所遇到的問題。

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