大神代码如下,仍然是自己加了部分注释
https://blog.csdn.net/qiqi_skystar/article/details/50923574
蓝桥杯建树的题目考的比较多的感觉,前几天做的安慰奶牛问题(最小生成树)也是链接如下https://blog.csdn.net/weixin_44284194/article/details/104620295
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int x,y,d;
} s[100000+5];
int n,f[10000+5];
bool cmp(node a,node b)
{
return a.d>b.d;
}
void Set()
{
for (int i=1; i<=n; i++)
f[i]=i;
}
int Find(int x)//查找根节点
{
if (f[x]==x)
return x;
return f[x]=Find(f[x]);
}
bool Union(int x,int y)
{
x=Find(x);
y=Find(y);
if (x!=y)
{
f[x]=y;
return 1;
}
return 0; //有相同根节点,表示两个点总能连在一起
}
int main()
{
int m;
while (~scanf("%d%d",&n,&m))
{
for (int i=1; i<=m; i++)
{
scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].d);
}
sort(s+1,s+m+1,cmp);
Set();
int pre=-1,ans=0;//表示前一次是在第几天进行反抗的
for (int i=1; i<=m; i++)
{
int way=Union(s[i].x,s[i].y);//way=0表示之前有桥,不需要在建桥
//这里是在倒序建桥,Union是把桥建立起来的函数
if (s[i].d!=pre&&way==1)
{
ans++;
pre=s[i].d;
}
}
cout<<ans<<endl;
}
return 0;
}
自己写的时候想的是深搜(其实我觉得思路也没有错叭?)
但是只过了3个,1个运行错误,其他都超时了生气
代码如下,如果有大佬愿意找下错误原因真的太感谢了!!
#include<iostream>
#include<algorithm>
using namespace std;
struct Lu
{
int x;
int y;
int t;
};
int n, m;
int bridge[10005][10005];
bool vis[10005];
Lu lu[10005];
int ans;
bool cmp(Lu a, Lu b)
{
return a.t < b.t;
}
bool dfs(int i, int j)
{
if(bridge[i][j]){
return true;
}
for(int x = 1; x <= n; x++){
if(bridge[i][x] && !vis[x] && x != i){
vis[x] = true;
if(dfs(x, j)){
vis[x] = false;
return true;
}
vis[x] = false;
}
}
return false;
}
int main()
{
scanf("%d%d", &n, &m);
int a, b, t;
for(int i = 0; i < m; i++){
scanf("%d%d%d", &a, &b, &t);
lu[i].x = a;
lu[i].y = b;
lu[i].t = t;
bridge[a][b]++;
bridge[b][a]++;
}
sort(lu, lu + m, cmp);
/*for(int i = 0; i < m; i++){
cout << "time:" << lu[i].x << ' ' << lu[i].y << ' ' << lu[i].t << endl;
}
*/
int day = 0;
for(int i = 0; i < m; i++){
a = lu[i].x;
b = lu[i].y;
bridge[a][b]--;
bridge[b][a]--;
if(lu[i].t != day){
if(dfs(a, b) == false){
ans++;
day = lu[i].t;
//cout << "tip:" << lu[i].x << ' ' << lu[i].y << ' ' << lu[i].t << endl;
}
}
}
cout << ans;
return 0;
}