标签:mit scanf style efi stack mat tac limit log
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<vector> 5 #include<map> 6 #include<set> 7 #include<cstring> 8 #include<cstdio> 9 #include<cmath> 10 #include<cstdlib> 11 #include<stack> 12 #include<iomanip> 13 #include<cctype> 14 #include<climits> 15 #include<queue> 16 #define INF 10001 17 using namespace std; 18 typedef long long ll; 19 typedef unsigned long long ull; 20 21 const int maxn=5000; 22 int u[maxn],v[maxn],fa[maxn],r[maxn],w[maxn]; 23 24 int find(int x) 25 { 26 return fa[x]==x?x:fa[x]=find(fa[x]); 27 } 28 29 int cmp(int i,int j) 30 { 31 return w[i]<w[j]; 32 } 33 34 void Kruskal(int m,int n) 35 { 36 int ans=INF; 37 for(int i=1;i<=m;i++) 38 r[i]=i; 39 sort(r+1,r+m+1,cmp); 40 for(int i=1;i<=m;i++){ 41 for(int j=1;j<=n;j++) 42 fa[j]=j; 43 int node=0,temp=0; 44 for(int k=i;k<=m;k++){ 45 int e=r[k]; 46 int x=find(u[e]); 47 int y=find(v[e]); 48 if(x!=y){ 49 fa[x]=y; 50 node++; 51 if(node==n-1){//题目已经说明G是一个连通图,所以当所有节点都访问到时,说明走成了一条通路,于是可以计算这条通路的苗条度。 52 temp=w[r[k]]-w[r[i]]; 53 ans=min(ans,temp); 54 break; 55 } 56 } 57 } 58 } 59 if(ans!=INF) 60 printf("%d\n",ans); 61 else 62 printf("-1\n"); 63 } 64 65 66 int main() 67 { 68 int m,n; 69 while(~scanf("%d %d",&n,&m)){ 70 if(n==0&&m==0) 71 return 0; 72 for(int i=1;i<=m;i++) 73 scanf("%d%d%d",&u[i],&v[i],&w[i]); 74 Kruskal(m,n); 75 } 76 return 0; 77 }
标签:mit scanf style efi stack mat tac limit log
原文地址:http://www.cnblogs.com/ooozy/p/6272298.html