POJ 1679

来源:互联网 发布:房间刮塑面积算法 编辑:程序博客网 时间:2024/05/21 13:56

思路:就是将选好的边一条条的删了在看能不能找出相同的答案

提供两种方法

1.用数组储存找出的边

1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int jh[310],m,n,shumu,del[310],k;struct aa{    int x,y,s;} ma[6000];int cmp(const aa &a,const aa &b){    return a.s<b.s;}int fin(int a){    while(a!=jh[a])        a=jh[a];    return a;}void reset(){    int a;    for(a=1; a<=n; a++)        jh[a]=a;}int kru(int de,int flag){    int a,b,c,ans=0;    shumu=n;    reset();    for(a=1; a<=m&&shumu>1; a++)        if(a!=de)        {            b=fin(ma[a].x);            c=fin(ma[a].y);            if(b!=c)            {                jh[b]=jh[ma[a].x]=jh[ma[a].y]=c;                ans+=ma[a].s;                shumu--;                if(flag==1)                    del[++k]=a;            }        }    return ans;}int main (){    int a,nn,ans,flag,b;    scanf("%d",&nn);    while(nn--)    {        scanf("%d%d",&n,&m);        flag=1;        k=0;        for(a=1; a<=m; a++)            scanf("%d%d%d",&ma[a].x,&ma[a].y,&ma[a].s);        sort(&ma[1],&ma[m+1],cmp);        ans=kru(-1,1);        if(shumu>1)        {            printf("0\n");            continue;        }        for(a=1; a<=k; a++)        {            b=kru(del[a],0);            if(shumu>1)                continue;            if(b==ans)            {                flag=0;                break;            }        }        if(flag==0)            printf("Not Unique!\n");        else            printf("%d\n",ans);    }    return 0;}


2.以忽视第几条边为判断条件


1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int jh[310],m,n,shumu,mark[6000];struct aa{    int x,y,s;} ma[6000];int cmp(const aa &a,const aa &b){    return a.s<b.s;}int fin(int a){    while(a!=jh[a])        a=jh[a];    return a;}void reset(){    int a;    for(a=1; a<=n; a++)        jh[a]=a;}int kru(int de,int flag){    int a,b,c,ans=0,num=0;    shumu=n;    reset();    for(a=1; a<=m&&shumu>1; a++)    {        if(mark[a]!=0)            num++;        if(num!=de)        {            b=fin(ma[a].x);            c=fin(ma[a].y);            if(b!=c)            {                jh[b]=jh[ma[a].x]=jh[ma[a].y]=c;                ans+=ma[a].s;                shumu--;                if(flag==1)                    mark[a]=1;            }        }        else            num++;//这里小心,不加的话之后会影响之后的判断    }    return ans;}int main (){    int a,nn,ans,flag,b;    scanf("%d",&nn);    while(nn--)    {        scanf("%d%d",&n,&m);        flag=1;        for(a=1; a<=m; a++)            scanf("%d%d%d",&ma[a].x,&ma[a].y,&ma[a].s);        sort(&ma[1],&ma[m+1],cmp);        memset(mark,0,sizeof(mark));        ans=kru(100000,1);        if(shumu>1)        {            printf("0\n");            continue;        }        for(a=1; a<=n-1; a++)        {            b=kru(a,0);            if(shumu>1)                continue;            if(b==ans)            {                flag=0;                break;            }        }        if(flag==0)            printf("Not Unique!\n");        else            printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击