1. 程式人生 > >POJ 3522 用不同的排序方式

POJ 3522 用不同的排序方式

col lse () pan mat lin spl nbsp n!

  這是一個蜜汁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

POJ 3522 用不同的排序方式