1 条题解
-
0
C++ :
#include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> #include <cmath> #include <ctime> #include <queue> #include <stack> #include <fstream> #include <algorithm> #include <map> using namespace std; int N,M; int my_max=0; int my_min=0x7fffffff; struct NODE{ int x,y; int va; }a[5005]; int ff[105],r1,r2; int f[105]; bool exist[10005]; int find(int x){ // cout<<x<<endl; if(x!=f[x])f[x]=find(f[x]); return f[x]; } int ffind(int x){ if(ff[x]!=x)ff[x]=ffind(ff[x]); return ff[x]; } bool tepan(){ for(int i=1;i<=N;i++)ff[i]=i; for(int i=1;i<=M;i++){ r1=ffind(a[i].x); r2=ffind(a[i].y); if(r1!=r2){ if(r1>r2)swap(r1,r2); ff[r2]=r1; } } for(int i=1;i<=N;i++)if(ffind(i)==i&&i!=1)return true; return false; } int comp(const NODE &X,const NODE &Y){ return X.va<Y.va; } bool bing(int s1,int s2){ for(int i=s1;i<=s2;i++){ r1=find(a[i].x); r2=find(a[i].y); if(r1!=r2){ if(r1>r2)swap(r1,r2); f[r2]=r1; } } for(int i=1;i<=N;i++)if(find(i)==i&&i!=1)return false; return true; } bool judge(int x){ int stj,t,j; memset(exist,0,sizeof(exist)); for(int i=1;i<=M;i++){ while(exist[a[i].va]==true)i++; t=a[i].va;//bool标记用过次边权 exist[a[i].va]=true; j=i+1; while(a[j].va-a[i].va<=x){ j++; if(j>M)break; } for(int v=1;v<=N;v++)f[v]=v; if(bing(i,j-1))return false;//如果此区间内的边并起来满足的话,差值大了 } return true;//怎么并都不行 } void work(){ int l=0; int r=my_max-my_min; int mid=(l+r)/2; while(l<=r){ mid=(l+r)/2; if(judge(mid))l=mid+1; else r=mid-1; } cout<<l<<endl; } int main(){ // freopen("1.in","r",stdin); //freopen("span.in","r",stdin); //freopen("span.out","w",stdout); scanf("%d%d",&N,&M); for(int i=1;i<=M;i++){ scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].va); my_max=my_max>a[i].va? my_max:a[i].va; my_min=my_min<a[i].va? my_min:a[i].va; } if(tepan()){ cout<<-1<<endl; return 0; } sort(a+1,a+M+1,comp); work(); fclose(stdin); fclose(stdout); return 0; }
- 1
信息
- ID
- 962
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者