第三天后3和4之间的桥不能使用,居民们会抗议。
解题思路:采用并查集的思想,逆向的将树建一遍,所以这里我需要对天数排序,从大到小进行排序。接着进行建树,在建树的过程中不断地进行判断,我之前是否有这个桥,如果没有那么就抗议次数++。这里还有一个需要注意的就是:前一次是在第几天抗议的,如果是同一天的话就不要++了,所以这里要特殊判断一下。
上述都是看别人题解粘过来的。其实这题很有趣在于,它是逆向建树,大家想想要是某时间断桥逆向来想不就是在某时间建桥呗,只要算的是多少组同时建起来那就是答案了。
#include<stdio.h> #include<algorithm> using namespace std; int pre[10020]; typedef struct point{ int r,l,t; }p; int cmp(p x,p y){ return x.t>y.t; } int find(int x) { return pre[x]==x?x:pre[x]=find(pre[x]); } int main() { int maxt=100020,mint=-1; int n,m,ans=0; p a[100020]; scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ scanf("%d%d%d",&a[i].r,&a[i].l,&a[i].t); } sort(a,a+m,cmp); for(int i=1;i<=n;i++){ pre[i]=i; } int pre_time=-1; for(int i=0;i<m;i++){ int fu=find(a[i].l); int fv=find(a[i].r); if(fu!=fv){ pre[fu]=fv; if(pre_time!=a[i].t) ans++; pre_time=a[i].t; } } printf("%d\n",ans); return 0; }