HDU 4750 Count The Pairs 并查集+二分+递推(2013 ACM/ICPC Asia Regional Nanjing Online 1003)
彩笔请多指教!
转载请注明出处__谢谢! http://www.cnblogs.com/HaibaraAi/articles/3335612.html by---HaibaraAi 求认识大神(ˇ^ˇ),目前只会水题- -#~~~!
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 #define INF 0x7fffffff 6 #define maxn 10005 7 #define maxm 500005 8 int n,m; 9 struct Edge{ 10 int from,to,dist; 11 bool operator<(const Edge& cmp)const{ 12 return dist<cmp.dist; 13 } 14 }e[500005]; 15 int g[maxn],f[maxn],p[maxm],ans[maxm]; 16 void init(){ 17 for(int i=0;i<=n;i++){f[i]=i;g[i]=1;} 18 } 19 int find(int x){ 20 if(x!=f[x])f[x]=find(f[x]); 21 return f[x]; 22 } 23 int main(){ 24 while(~scanf("%d%d",&n,&m)){ 25 init(); 26 for(int i=1;i<=m;i++){ 27 int a,b,v; 28 scanf("%d%d%d",&a,&b,&v); 29 e[i].from=a;e[i].to=b;e[i].dist=v; 30 } 31 sort(e+1,e+m+1); 32 ans[0]=0;p[m]=INF; 33 for(int i=1;i<=m;i++){ 34 p[i-1]=e[i].dist; 35 int x=find(e[i].from); 36 int y=find(e[i].to); 37 if(x==y)ans[i]=ans[i-1]; 38 else{ 39 ans[i]=ans[i-1]+(g[x]+g[y])*(g[x]+g[y]-1)-g[x]*(g[x]-1)-g[y]*(g[y]-1); 40 g[x]+=g[y]; 41 f[y]=x; 42 } 43 } 44 for(int i=0;i<=m;i++)ans[i]=n*(n-1)-ans[i]; 45 int tol,t,k; 46 scanf("%d",&tol); 47 while(tol--){ 48 scanf("%d",&t); 49 k=lower_bound(p,p+m,t)-p; 50 printf("%d\n",ans[k]); 51 } 52 } 53 return 0; 54 }
浙公网安备 33010602011771号