1. 程式人生 > >[USACO06JAN]Redundant Paths

[USACO06JAN]Redundant Paths

算法 結點 cst 沒有 poj class dig red span

OJ題號:
洛谷2860、POJ3177

題目大意:
給定一個無向圖,試添加最少的邊使得原圖中沒有橋。

思路:
Tarjan縮點,然後統計度為$1$的連通分量的個數(找出原圖中所有的橋)。
考慮給它們每兩個連通分量連一條邊,這樣一次性可以解決兩個。
如果最後還有多的,就專門給它隨便連一條邊。
設度為$1$的連通分量的個數為$c$,則答案為$\lfloor{\frac{c+1}{2}}\rfloor$。
因為是無向圖,所以用一般的Tarjan會來回走同一條邊,這樣就會把橋的兩岸縮在同一個點中,不合題意。
考慮Tarjan中記錄當前結點的父親結點,往下遞歸時判斷是否與其相等。這樣看起來是正確的,但是交到洛谷上會WA一個點。

因為原圖中不一定保證相同的兩個點之間只有一條邊,因此如果當某兩點間同時存在兩條邊時,不能算橋。但是按照上面的算法不會將這兩點縮在一起。
考慮記錄每條邊的編號,每次遞歸判斷枚舉到的出邊是否與入邊編號相等即可。

 1 #include<stack>
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<vector>
 5 inline int getint() {
 6     char ch;
 7     while(!isdigit(ch=getchar()));
 8
int x=ch^0; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^0); 10 return x; 11 } 12 const int V=5001; 13 struct Edge { 14 int to,id; 15 }; 16 std::vector<Edge> e[V]; 17 inline void add_edge(const int u,const int v,const int id) { 18 e[u].push_back((Edge){v,id});
19 } 20 int dfn[V]={0},low[V]={0},scc[V]={0},cnt=0,id=0; 21 bool ins[V]={0}; 22 std::stack<int> s; 23 void Tarjan(const int x,const int eid) { 24 dfn[x]=low[x]=++cnt; 25 s.push(x); 26 ins[x]=true; 27 for(unsigned i=0;i<e[x].size();i++) { 28 if(e[x][i].id==eid) continue; 29 int &y=e[x][i].to; 30 if(!dfn[y]) { 31 Tarjan(y,e[x][i].id); 32 low[x]=std::min(low[x],low[y]); 33 } 34 else if(ins[y]) { 35 low[x]=std::min(low[x],dfn[y]); 36 } 37 } 38 if(low[x]==dfn[x]) { 39 int y; 40 id++; 41 do { 42 y=s.top(); 43 s.pop(); 44 ins[y]=false; 45 scc[y]=id; 46 } while(y!=x); 47 } 48 } 49 int deg[V]={0}; 50 int main() { 51 int n=getint(); 52 for(int m=getint();m;m--) { 53 int u=getint(),v=getint(); 54 add_edge(u,v,m); 55 add_edge(v,u,m); 56 } 57 for(int i=1;i<=n;i++) { 58 if(!dfn[i]) Tarjan(i,0); 59 } 60 for(int x=1;x<=n;x++) { 61 for(unsigned i=0;i<e[x].size();i++) { 62 int &y=e[x][i].to; 63 if(scc[x]!=scc[y]) deg[scc[x]]++,deg[scc[y]]++; 64 } 65 } 66 int cnt=0; 67 for(int i=1;i<=id;i++) { 68 if(deg[i]==2) cnt++; 69 } 70 printf("%d\n",(cnt+1)>>1); 71 return 0; 72 }

[USACO06JAN]Redundant Paths