您的位置:首页 > 其它

POJ 3660 Cow Contest

2016-08-26 14:15 357 查看


题目大意:概况点说就是给你n个学生 m个情况 后面m行为前者排在后者的前面 问你从m种情况后 有几个学生的位置可以确定

解题思路:有明显这是一道弗洛伊德的变型题 网上很多结题报告都说的是传递闭包

dp[i][j]=1来标记i在j的前面 传递性主要在以下这种情况

当i在j的前面 j在k的前面必然可以得到i在k的前面 所以当dp[i][j]=1 dp[j][k]=1 那么可以得到dp[i][k]=1

之后来个遍历便可以得到有几个学生的位置可以确定了

//Memory:208 KB
//Time:16 MS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>

using namespace std;

#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define sssc(x)   scanf("%s",s)
#define sdsc(x,y) scanf("%s %s",x,y)
#define ssc(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b)  memset(a,b,sizeof(a))
#define Inf 1<<29

const int maxn=105;
int n,m,mp[maxn][maxn],ans;
bool flag;
int main()
{
while(~dsc(n,m))
{
FOR(i,m,1)
{
int a,b;
dsc(a,b);
mp[a][b]=1;
}
FOR(k,n,1)
{
FOR(i,n,1)
{
FOR(j,n,1)
{
if(mp[i][k]&&mp[k][j])
mp[i][j]=1;//传递性
}
}
}
FOR(i,n,1)
{
flag=true;
FOR(j,n,1)
{
if(i==j)
continue;
if((!mp[i][j])&&(!mp[j][i]))
{
flag=false;
break;
}
}
if(flag)
ans++;
}
pr(ans);
}
return 0;
}


END!!!!!!!!!!!!!!!!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: