洛谷 P1656 炸铁路
题目描述
因为某国被某红色政权残酷的高压暴力统治。美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵。
该国有n个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。
uim发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为key road。
uim为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。
然而,只有一发炮弹(美国国会不给钱了)。所以,他能轰炸哪一条铁路呢?
输入输出格式
输入格式:
第一行n,m(1<=n<=150, 1<=m<=5000),分别表示有n个城市,总共m条铁路。
以下m行,每行两个整数a, b,表示城市a和城市b之间有铁路直接连接。
输出格式:
输出有若干行。
每行包含两个数字a,b(a<b),表示<a,b>是key road。
请注意:输出时,所有的数对<a,b>必须按照a从小到大排序输出;如果a相同,则根据b从小到大排序。
输入输出样例
输入样例#1: 复制
6 6
1 2
2 3
2 4
3 5
4 5
5 6
输出样例#1: 复制
1 2
5 6
思路:并查集维护,暴力删边就可以了。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 5010 using namespace std; int n,m; int fa[MAXN]; struct nond{ int a,b; }edge[MAXN]; int find(int x){ if(fa[x]==x) return x; else return fa[x]=find(fa[x]); } int cmp(nond x,nond y){ if(x.a==y.a) return x.b<y.b; return x.a<y.a; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&edge[i].a,&edge[i].b); if(edge[i].a>edge[i].b) swap(edge[i].a,edge[i].b); } sort(edge+1,edge+1+m,cmp); for(int i=1;i<=m;i++){ int tot=0; for(int j=1;j<=n;j++) fa[j]=j; for(int j=1;j<=m;j++){ if(i==j) continue; int dx=find(edge[j].a); int dy=find(edge[j].b); if(dx==dy) continue; fa[dx]=dy;tot++; if(tot==n-1) break; } if(tot<n-1) cout<<edge[i].a<<" "<<edge[i].b<<endl; } }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。