拓扑排序(猜序列,LA 4255)

看来自己图论建模的功底还不够。

百度百科说

图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

可见图论是事物建立关系的数学模型。

因此想要利用图论建模,首先就要发现问题中的事物与关系。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 15;
int N;
char ch[maxn][maxn];
int G[maxn][maxn];
int B[maxn];
int c[maxn];
int r[maxn];

int rela(char c)
{
    return c=='+'?1:0;
}

int t;

void dfs(int u)
{
    c[u]=1;
    for(int v=0;v<=N;v++) if(!c[v]&&G[u][v]) dfs(v);
    r[t--]=u;
}

void debug()
{
    for(int i=1;i<=N;i++)
    {
        for(int j=i;j<=N;j++)
            printf("%c",ch[i][j]);
        puts("");
    }
}

void topo()
{
    memset(c,0,sizeof(c));
    t=N;
    for(int i=0;i<=N;i++) if(!c[i])
        dfs(i);
    int num=10;
    B[r[N]]=10;
    for(int i=N-1;i>=0;i--)
    {
        int a=min(r[i],r[i+1]);
        int b=max(r[i],r[i+1]);
        if(ch[a+1][b]=='0') B[r[i]]=B[r[i+1]];
        else B[r[i]]=--num;
    }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        getchar();
        for(int i=1;i<=N;i++)
            for(int j=i;j<=N;j++)
                ch[i][j]=getchar();
        //debug();
        for(int i=0;i<=N;i++)
            for(int j=i+1;j<=N;j++)
            {
                G[i][j]=rela(ch[i+1][j]);
                G[j][i]=!G[i][j];
            }
        topo();
        for(int i=N;i>=0;i--)
            B[i]-=B[0];
        for(int i=1;i<=N;i++)
            printf("%d%c",B[i]-B[i-1],i==N?'\n':' ');
    }
    return 0;
}
    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/xl2015190026/article/details/54913789
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞