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

来源:互联网 发布:mac 收音机软件 编辑:程序博客网 时间:2024/06/04 18:10

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


百度百科说

图论〔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;}


0 0