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!!!!!!!!!!!!!!!!!!!!!!!!
相关文章推荐
- POJ 3660 Cow Contest(传递闭包floyed算法)
- POJ 3660 Cow Contest
- Poj 3660 Cow Contest(Floyd)
- Cow Contest(POJ 3660)(Floyd)(任意两点间最短路)
- POJ3660 Cow Contest【最短路-floyd】
- POJ 3660 &&NYOJ 211 Cow Contest(Floyd传递闭包)
- POJ 3660 Cow Contest
- POJ 3660 Cow Contest
- POJ-3660-Cow Contest [最短路][Floyd]
- POJ 3660 Cow Contest (floyd求联通关系)
- POJ - 3660 - Cow Contest (floyd求传递闭包)
- POJ 3660 Cow Contest (简单floyd)
- poj-3660 cow contest
- poj-3660 Cow Contest
- POJ 3660 Cow Contest 最短路floyd
- POJ 3660 Cow Contest(Floyd最短路)
- POJ-3660 Cow Contest(floyd)
- 【Floyd 判断关系】POJ - 3660 Cow Contest
- POJ 3660 Cow Contest 传递闭包
- POJ 3660 Cow Contest(Floyd传递闭包)