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

这题居然标题是英文的而题目是中文的,所以题意大家都很了解啦,这题就是个典型的图论题,我是去学习了一下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");
    }
}

你可能感兴趣的:(ACM,poj)