看来自己图论建模的功底还不够。
百度百科说
图论〔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;
}