50234237海岛帝国:战争前线
【试题描述】
总指挥官WHT出神入化的计谋虽然大有用武之地,但是聪明的恐怖分子们采取了城市核武器防御系统,可以有效地抵制WHT的炸弹。YSF对此头痛不已,因此 召开了一次国家性大会。在会上,WHT、LJX、LTJ等人均提出了战略方针。可全部被拒绝。WHT对核武器防御系统是一筹莫展。如果再迟几天,敌人的核 武器就会全部生产完毕并开始狂轰滥炸。就在这危难之时,匆匆忙忙从美国的卡内基梅隆大学作为博士生赶回的YSM掌握了此消息。于是,他提出:如果使用核武 器炸断敌军的路,或许就能解围。没有主见的WHT也采取了他的办法,照抄照办。WHT掌握着很多很多枚“蝴蝶”。他要启动计划B。然而由于形势日益紧张, “药师傅”帝国资源极其稀缺,WHT想用很快的方法来求出最少需要炸断几条路,才能使整个敌国的城市不连通,正常人不可能很快做到这一点,所以,他请你来 编个程序告诉他。
【输入要求】
* 第一行两个正整数N,M,表示有N个城市,有M条路
* 接下来M行:每行两个数A,B表示城市A和B之间有一条路相连
【输出要求】
在做到使整个敌国的城市不连通炸的路最少的情况下,输出要炸的路,形如a-b,回车分隔。
【输入实例】
6 6
1 4
1 3
4 2
3 2
2 5
5 6
【输出实例】
5-6
2-5
【其他说明】
M均小于40
N均小于10
【试题分析】
其实想一想,只需要更改求割点的一个符号而已:low[v]>=num[u] => low[v]>num[u],为什么呢?low[v]>=num[u]代表的是点v是不可能在经过父亲节点u而回到祖先的,所以顶点u是割点,如果low[v]和num[u]相等,则表示还可以回到父亲节点u而回到父亲,而low[v]>num[u]则表示连父亲都回不到了。如果顶点V不能回到祖先,也没有另一条路能回到父亲,那么u-v这条边就是割边。
【代码】
1 #include<iostream> 2 using namespace std; 3 int n,m,e[10][10],root; 4 int num[10],low[10],index; 5 void dfs(int cur,int father) 6 { 7 int i; 8 index++; 9 num[cur]=index; 10 low[cur]=index; 11 for(int i=1;i<=n;i++) 12 { 13 if(e[cur][i]==1) 14 { 15 if(num[i]==0) 16 { 17 dfs(i,cur); 18 low[cur]=min(low[cur],low[i]); 19 if(low[i]>num[cur]) printf("%d-%d ",cur,i); 20 } 21 else if(i!=father) low[cur]=min(low[cur],num[i]); 22 } 23 } 24 return; 25 } 26 int main() 27 { 28 int x,y; 29 cin>>n>>m; 30 for(int i=1;i<=n;i++) 31 for(int j=1;j<=n;j++) 32 e[i][j]=0; 33 for(int i=1;i<=m;i++) 34 { 35 cin>>x>>y; 36 e[x][y]=1; 37 e[y][x]=1; 38 } 39 root=1; 40 dfs(1,root); 41 }