题意:n个数,下标从1~n,输入m个关系(输入的为下标),前面的数大于后面的数,问这些数中可能是中位数的标为1,不可能的为0。
思路:floyd跑一遍就行了。注意前后矛盾的就是不可能的情况,全部为0,一个数不可能比本身大,a>b之后,b不可能大于a。
当时做的时候题意没读对,以为是只有能确定为中位数的才输出1,原来是只要有可能就输出1。
代码如下:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define fori(a,b) for(int i=a;i<=b;i++)
#define forj(a,b) for(int j=a;j<=b;j++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double PI = acos(-1);
const int M=1e2+10;
int mmap[M][M];
int ru[M],chu[M];
int main()
{
//freopen("//home//acm//桌面//in","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
mem(mmap,0);
mem(ru,0);
mem(chu,0);
int n,m,a,b,flag=0;
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++){
scanf("%d%d",&a,&b);
if(mmap[b][a]||a==b) //前后矛盾
flag=1;
else
mmap[a][b]=1;
}
if(!flag){
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(mmap[i][k]&&mmap[k][j]){
if(mmap[j][i]) //前后矛盾
flag=1;
mmap[i][j]=1;
}
}
}
}
}
if(!flag){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mmap[i][j]){
chu[i]++;
ru[j]++;
}
}
}
int pos=-1;
for(int i=1; i<=n; i++){
if(ru[i]<=n/2&&chu[i]<=n/2)
printf("1");
else
printf("0");
}
}
else {
for(int i=1;i<=n;i++)
printf("0");
}
printf("\n");
}
return 0;
}