Kingdom
Problem Description
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.
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.
Input
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.
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.
Output
If there is no solution just output "-1". Otherwise output n integers representing the order to develop this kingdom.
Sample Input
3 011 001 000 0
Sample Output
1 2 3
题意 :给出一个图满足两两之间都有一条边,然后选择建设的城市,满足当前选的城市和之前选的城市之间最多距离为2. 求建设城市的顺序。
sl :刚开始傻逼了没看到红色的话,比赛的时候更傻逼,提都理解错了。妈蛋白敲了100+代码。 其实选下最大度数的节点就好了,证明就是题解
的那个证明,反证。因为确保都有一条边所以题解是对的,我说开始为什么看着不对呢
#include <cstdio>
#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 ",res[i]);
else printf("%d ",res[i]);
}
}
return 0;
}
#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 ",res[i]);
else printf("%d ",res[i]);
}
}
return 0;
}