uva 1395 slim span MST

来源:互联网 发布:人工智能 李开复 pdf 编辑:程序博客网 时间:2024/06/07 18:01




(注意看样例来确定自己的枚举,不要再出这样的错误了。。


#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<string>#include<cstring>#include<iomanip>#include<iostream>#include<stack>#include<cmath>#include<map>#include<vector>#define ll long long#define inf 0x3f3f3f3f#define INF 1e9#define bug1 cout<<"bug1"<<endl;#define bug2 cout<<"bug2"<<endl;#define bug3 cout<<"bug3"<<endl;using namespace std;#define sf scanf#define pf printf#define mem(a,b) memset(a,b,sizeof(a));int n,m;const int maxn=105;struct Edge{    int u,v,c;    bool friend operator<(Edge a,Edge b){        return a.c<b.c;    }}edge[maxn*maxn/2];int fa[maxn];int find(int x){    return x==fa[x]?x:fa[x]=find(fa[x]);}int main(){    while(~scanf("%d%d",&n,&m)&&n+m){        for(int i=1;i<=m;++i){            int u,v,c;            sf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].c);        }        sort(edge+1,edge+1+m);        int L=1,R=L+n-1;        int ans=INF;        for(L=1;L<=m-n+2;++L){//这个地方我因为一开始写的是m-n+1,结果样例答案都错了。。                //我应该花一些时间来看下第一个样例。然后觉得m-n+1 还是多少。。            for(R=L;R<=m;++R){//这个地方也是,我想用R=L+n-1,还是会错                for(int k=1;k<=n;++k)fa[k]=k;                int fg=0;                int cnt=0;                for(int i=L;i<=R;++i){                    int fx=find(edge[i].u);int fy=find(edge[i].v);                    if(fx!=fy){                        fa[fx]=fy;                        cnt++;                    }                    if(cnt==n-1){                        ans=min(ans,edge[R].c-edge[L].c);                        fg=1;                        break;                    }                }                if(fg)break;            }        }        if(ans<INF)pf("%d\n",ans);        else puts("-1");    }}

0 0
原创粉丝点击