北大机试最小生成树

来源:互联网 发布:windows正版价格 编辑:程序博客网 时间:2024/05/21 05:43

哎。。。策略错误。。。最小生成树竟然没写完。。。。就差一点就ac五道了T_T

#include <iostream>#include <string>#include <ctype.h>#include <algorithm>#include <string.h>#include <cstdio>#include <cstdlib>using namespace std;struct path{    int name1;    int name2;    float pathl;};float l;int n;int m;string name[505];struct path p[505];bool in[505];int cmp(struct path a,struct path b){    return a.pathl<b.pathl;}int isin(int i){    if(in[p[i].name1] && !in[p[i].name2])    {        in[p[i].name2]=true;        return 0;    }    else    {        if(!in[p[i].name1] && in[p[i].name2])        {            in[p[i].name1]=true;            return 0;        }    }    if(in[p[i].name1] && in[p[i].name2])        return 1;    return -1;}float getlen(){    int rh=n-2;    sort(p,p+m,cmp);    float res=p[0].pathl;    in[p[0].name1]=in[p[0].name2]=true;    int i=1;    int j=1;    while(rh>0)    {        int t=isin(j);        if(t==0)        {            rh--;            i++;            res+=p[j].pathl;            for(int k=j;k>=i;k--)                p[k]=p[k-1];            j=i;        }        else        {            if(t==1)            {                i++;                for(int k=j;k>i;k--)                    p[k]=p[k-1];                j++;            }            else                j++;        }    }    return res;}int main(){    cin>>l;    cin>>n;    for(int i=0;i<n;i++)        cin>>name[i];    string a,b;    float tl;    int flag;    cin>>m;    for(int i=0;i<m;i++)    {        flag=0;        cin>>a>>b;        cin>>p[i].pathl;        for(int j=0;j<n;j++)        {            if(name[j]==a)            {                p[i].name1=j;flag+=1;            }            if(name[j]==b)            {             p[i].name2=j;flag+=1;            }            if(flag==2)                break;        }    }    float minl=getlen();    if(minl>l)        cout<<"Not enough cable";    else        printf("Need %.1f miles of cable",minl);    return 0;}


0 0
原创粉丝点击