Teacher Mai has a kingdom consisting of n cities. He has planned the transportation of the kingdom. Every pair of cities has exactly a one-way road.
He wants develop this kingdom from one city to one city.
Teacher Mai now is considering developing the city w. And he hopes that for every city u he has developed, there is a one-way road from u to w, or there are two one-way roads from u to v, and from v to w, where city v has been developed before.
He gives you the map of the kingdom. Hope you can give a proper order to develop this kingdom.
There are multiple test cases, terminated by a line "0".
For each test case, the first line contains an integer n (1<=n<=500).
The following are n lines, the i-th line contains a string consisting of n characters. If the j-th characters is 1, there is a one-way road from city i to city j.
Cities are labelled from 1.
If there is no solution just output "-1". Otherwise output n integers representing the order to develop this kingdom.
#include <cstring>
#include <algorithm>
#include <vector>
#include <vector>
using namespace std;
const int inf = 0x3f3f3f3f;
const int MAX = 500+10;
char str[MAX][MAX];
int in[MAX],vis[MAX],G[MAX][MAX];
vector<int> res;
int main() {
int n;
while(scanf("%d",&n)==1&&n) {
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
res.clear();
for(int i=1;i<=n;i++) {
scanf("%s",str[i]+1);
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(str[i][j]==‘1‘) {
G[i][j]=1; in[j]++;
}
}
}
for(int i=1;i<=n;i++) {
int node,Max=0;
for(int j=1;j<=n;j++) {
if(!vis[j]) {
if(Max<=in[j]) {
node=j; Max=in[j];
}
}
}
for(int j=1;j<=n;j++) if(G[node][j]) in[j]--;
vis[node]=1;
res.push_back(node);
}
// printf("s");
for(int i=res.size()-1;i>=0;i--) {
if(!i) printf("%d\n",res[i]);
else printf("%d ",res[i]);
}
}
return 0;
}