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 }
View Code

猜你喜欢

转载自www.cnblogs.com/llllrj/p/9383269.html