題意:
有一些小島,這些小島上有一些邊,讓你加一條邊,使得原先的那些邊的橋數最少。
做法:1,把小島為點,連線小島的為邊建圖。
2,求出圖中的所有強聯通分量
3,把所有的強聯通分量看成乙個點建樹。
4,求樹的直徑,新加的那條邊應該在直徑的兩邊,這樣才能使得圖中的橋最小。
#pragma comment(linker, "/stack:1024000000,1024000000")
#include#include#include#include#include#include#includeusing namespace std;
#define maxn 200003
#define mem(a,b) memset(a,b,sizeof(a))
vectorq[maxn];
stackqq;
struct list
edge[maxn*10];
struct ll
node[maxn*5];
int tops,times,nums,n,m;
int dnf[maxn];
int low[maxn];
int instack[maxn];
int head[maxn*10];
int vis[maxn*10];
int dist[maxn];
int num[maxn];
int visit[maxn];
void add(int x,int y)
void tarjan(int x)
else if(instack[y])
}if(low[x]==dnf[x])
nums++;
}}int spfa(int x)
queuepp;
pp.push(x);
dist[x]=0;
visit[x]=1;
while(!pp.empty())
}return ip;
}int main()
for(i=0;i
hdu 4612 求邊連通分量 求樹的直徑
題意 加一條邊,使得橋的數量最少?思路 求邊連通分量,縮點,然後變成乙個樹,樹邊都是橋,求樹的直徑。樹的直徑就是最多減少的橋。橋的數量最少就是原圖中的橋的數量 樹的直徑。要注意重邊。pragma comment linker,stack 1024000000,1024000000 include i...
HDU 4612 雙聯通分量 樹的直徑
點選開啟鏈結 題意 給乙個無向聯通圖,裡面可能有重邊,問新增一條邊後,使得圖中的橋最小,將橋的數量輸出 思路 剛剛讀完題,就有了思路去寫,無非就是將聯通圖雙聯通分量後縮點,然後求一條最長的路,首尾相連,肯定將更多的橋包含使得這些橋不再是橋,很好想的題,但是錯了20 什麼鬼,md重邊這麼難處理,醉了 ...
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...