POJ 3522 用不同的排序方式
这是一个蜜汁WA了的代码。。
说好的样例对了就是对了呢orz
反正我个人认为思路是没问题的不知道WA在哪了,丢个坑在这里以后填吧
1 //思路: 2 //1节点连接的边都记录下来,依次克鲁斯卡尔枚举得出最小值。 3 //排序思路:将所有边按与枚举的边的差值排序。 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 const int inf = (1<<31)-1; 9 const int maxn=1e2+5; 10 struct qa 11 { 12 int u,v,w; 13 }q[5000]; 14 int n,m; 15 int mf; 16 int f[maxn],p[maxn]; 17 bool b[maxn]; 18 inline bool cmp(const qa &a,const qa &b) 19 { 20 return abs(a.w-mf)<abs(b.w-mf); 21 } 22 inline int find1(int x) 23 { 24 return f[x]==x?x:f[x]=find1(f[x]); 25 } 26 int zx()//就是克鲁斯卡尔。。 27 { 28 int t=0; 29 for(int i=1;i<=n;i++) 30 f[i]=i; 31 int maxx=mf,minn=mf; 32 sort(q+1,q+m+1,cmp); 33 for(int i=1;i<=m;i++) 34 { 35 int x=find1(q[i].u),y=find1(q[i].v); 36 if(x!=y) 37 { 38 f[x]=y; 39 maxx=max(maxx,q[i].w); 40 minn=min(minn,q[i].w); 41 t++; 42 } 43 if(t==n-1)return maxx-minn; 44 } 45 return -1; 46 } 47 int main() 48 { 49 while(scanf("%d%d",&n,&m),n||m){ 50 int ans=0; 51 for(int i=1;i<=m;i++) 52 { 53 scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w); 54 if(q[i].u==1||q[i].v==1)p[++ans]=q[i].w; 55 } 56 int minn=inf; 57 for(int i=1;i<=ans;i++) 58 { 59 mf=p[i]; 60 int mm=zx(); 61 if(mm==-1)continue; 62 minn=min(minn,mm); 63 } 64 if(minn!=inf)printf("%d\n",minn); 65 else printf("-1\n"); 66 } 67 return 0; 68 }
适当比较,砥砺前行