传递闭包算法是用来解决图论上一个点是否能到达另一个点的算法,那么我们把Floyd算法稍微改下就可得到:
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (E[i][k] && E[k][j])
E[i][j] = 1;
POJ1975 Median Weight Bead
题目大意:
给定物体的两者重量关系(不全)算出所有不可能成为排序的中位数的个数(保证总个数为奇数)那么这道题我们把每个点的可以到达那条边设为a>b,记为E[i][j]=1,小于则是E[j][i],如果两者有一条大于n/2则cnt++;
#include<queue>
#include<iostream>
#include<cstdio>
#include<string.h>
#include<vector>
#include<cstring>
#include<cctype>
#include<cmath>
#include<set>
#include<algorithm>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
bool E[105][105];
int main()
{
int t;
cin>>t;
while(t--)
{
int m,n,cnt=0;
cin>>n>>m;
memset(E,0,sizeof(E));
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
E[x][y]=1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(E[i][k]&&E[k][j])E[i][j]=1;
for(int i=1;i<=n;i++)
{
int from=0,to=0;
for(int j=1;j<=n;j++)
{
from+=E[j][i];
to+=E[i][j];
}
cnt+=from>n/2 || to>n/2;
}
cout<<cnt<<endl;
}
return 0;
}