作者:聂依依mma | 来源:互联网 | 2023-10-15 07:12
本题为并查集题目,个人觉得本题的答案并不唯一
题目的大意为:为了方便沟通任一两地之间,所以删除一条路的时候沟通另外一条路(一天只能进行一次),并且让花费的天数尽可能的少,所以在这里就得用并查集对是否成环进行判断。对成环的路断开,然后在端点连接另外一条与上一个环没有交点的路线,渣渣可能说的不太详细,各大神结合代码和题目样例再进行思考吧,就说到这里,下面附上AC代码。
这里写代码片
using namespace std;int pre[1005];
struct Node{int u,v;
}a[1005];
int find(int x){if(x!=pre[x]){pre[x]=find(pre[x]);}return pre[x];
}
void join(int x,int y){int i=find(x);int j=find(y);pre[i]=j;
}
int main(){int n;while(~scanf("%d",&n)){int cnt&#61;0;for(int i&#61;0;i<&#61;n;i&#43;&#43;){pre[i]&#61;i;}for(int i&#61;0;i1;i&#43;&#43;){int x,y;scanf("%d %d",&x,&y);if(find(x)&#61;&#61;find(y)){a[cnt].u&#61;x;a[cnt].v&#61;y;cnt&#43;&#43;;}else{join(x,y);}}printf("%d\n",cnt);int sum&#61;0;for(int i&#61;1;i<&#61;n;i&#43;&#43;){for(int j&#61;1;j<&#61;n;j&#43;&#43;){if(find(i)!&#61;find(j)){printf("%d %d %d %d\n",a[sum].u,a[sum].v,i,j);join(i,j);sum&#43;&#43;;if(sum&#61;&#61;cnt) break;}}}}
}