POJ1659 Frogs' Neighborhood ACM解题报告(图论基础 邻接矩阵)

来源:互联网 发布:中保险网络大学ii 编辑:程序博客网 时间:2024/05/16 20:30
这题居然标题是英文的而题目是中文的,所以题意大家都很了解啦,这题就是个典型的图论题,我是去学习了一下havel-hakimi定理,这题就是判断那个数组是否可图化,如果可以就输出图的邻接矩阵。定理可以参考

http://www.docin.com/p-540438846.html。这题一开始我用数组存,整的那叫一个麻烦还就是不过sample,后来百度说用结构体存点的度和起始的位置,就很快秒杀了这题。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct vertex{    int degree;    int index;}v[11];int n,b[11][11];bool cmp(struct vertex a,struct vertex b){    return a.degree>b.degree;}bool havel(struct vertex v[]){    for(int i=0;i<n-1;i++)    {        sort(v+i,v+n,cmp);        int t=v[i].index;        for(int j=i+1;j<=i+v[i].degree;j++)        {            b[t][v[j].index]=1;            b[v[j].index][t]=1;//无向图是对称的            v[j].degree--;            if(v[j].degree<0) return false;//判断是否可图化        }    }    if(v[n-1].degree!=0) return false;//是否可图化    return true;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(b,0,sizeof(b));        for(int i=0;i<n;i++)        {            v[i].index=i;//起始的位置            scanf("%d",&v[i].degree);        }        if(havel(v))        {            printf("YES\n");            for(int i=0;i<n;i++)            {                for(int j=0;j<n;j++)                {                    if(j==n-1) printf("%d\n",b[i][j]);                    else printf("%d ",b[i][j]);                }            }        }        else printf("NO\n");        printf("\n");    }}

0 0