题目链接

题意:n个人,每个人有一个能力值。给出m组关系A, B, 表示A的能力值大于B的能力值。

问:m组关系中是否有自相矛盾的?若不矛盾,问:第1个人在所有人的能力值中排名第几?有多少人的能力值的排名可以确定?

题解:拓扑排序。存两个图,原图与反图。

若原图可达该点数+反图可达该点数-1 = n,则排名确定。

bitset一下。

 #include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define pii pair<int, int>
#define mp make_pair
typedef long long ll; vector<int> ve[], rve[];
int in[], rin[];
bitset<> dp[], rdp[];
int ra[], rra[];
int topsort(int n, int* in, vector<int>* ve, bitset<>* dp, int* ra){
queue<int> Q;
for(int i = ; i <= n; i++)
if(in[i] == ) Q.push(i);
int ret = ;
while(!Q.empty()){
int p = Q.front();
Q.pop();
ret++;
ra[p] = ret;
for(int i = ; i < ve[p].size(); i++){
int to = ve[p][i];
in[to]--;
dp[to] |= dp[p];
if( !in[to] ) Q.push(to);
}
}
return ret == n;
}
void debug(int n){
puts("*******************");
for(int i = ; i <= n; i++){
cout << i << endl;
cout << dp[i] << ' ' << rdp[i] << endl;
}
puts("********end********");
}
int main(){
int t; scanf("%d", &t);
while(t--){
int n, m, u, v;
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
ve[i].clear();
rve[i].clear();
in[i] = rin[i] = ;
ra[i] = rra[i] = ;
dp[i].reset(), rdp[i].reset();
dp[i][i-] = rdp[i][i-] = ;
}
for(int i = ; i < m; i++){
scanf("%d%d", &u, &v);
ve[u].push_back(v);
in[v]++;
rve[v].push_back(u);
rin[u]++;
} if( !topsort(n, in, ve, dp, ra) )//有向图有环
puts("Wrong");
else{
topsort(n, rin, rve, rdp, rra);
//前面有 dp[i]-1 个, 后面有 rdp[i]-1 个;
printf("%d\n", dp[].count()+rdp[].count()- == n? ra[]:-);
int sum = ;
for(int i = ; i <= n; i++)
if(dp[i].count()+rdp[i].count()- == n) sum++;
printf("%d\n", sum);
}
}
return ;
}

另解:floyd

CSU 1802 小X的战斗力【拓扑dp】的更多相关文章

  1. 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)

    LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...

  2. Codeforces Round #374 (Div. 2) A , B , C 水,水,拓扑dp

    A. One-dimensional Japanese Crossword time limit per test 1 second memory limit per test 256 megabyt ...

  3. codeforces 721C (拓扑+dp)

    题意就是某个人去游览,起点是1点,终点是n点,他总的游览时间不能超过t,第一行给你3个数字,点的个数n,边的个数m,时间t,然后底下m行数据,每行代表一条边,边的起点,终点和权值(走过去花的时间),然 ...

  4. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...

  5. luogu2149 Elaxia的路线 (dijkstra+拓扑dp)

    先标记上一个人所有最短路上的边(同时也要标记反向边) 然后拿着另一个人最短路上的边(会构成一个DAG)去做拓扑dp,记从原点到某个点的最大的某个路径的被标记的边的个数 #include<bits ...

  6. UVA 11324.The Largest Clique tarjan缩点+拓扑dp

    题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...

  7. 小明的密码-初级DP解法

    #include #include #include using namespace std; int visited[5][20][9009];// 访问情况 int dp[5][20][9009] ...

  8. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

  9. 湖南省第十二届大学生计算机程序设计竞赛 B 有向无环图 拓扑DP

    1804: 有向无环图 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 187  Solved: 80[Submit][Status][Web Board ...

随机推荐

  1. [C++]C++标准里 string和wstring

    typedef basic_string<char> string; typedef basic_string<wchar_t> wstring; 前者string是常用类型, ...

  2. 三种用于select 的选择器

    <html lang="en"> <head> <meta charset="utf-8"> <title>选项 ...

  3. Android调试常用的工具简单介绍

    配置Android环境的时候,我们需要安装sdk.在sdk的目录下: platform-tools 目录下的adb tool下的: ddms.bat adb :可以cd 当前目录,然后使用相应的命令, ...

  4. andriod 新建Activity_ Form

    在一个Android工程,如何新建一个Activity? 一:新建一个类(*.class),继承自android.app.Activity类. 二:在res/layout目录下新建一个布局xml文件, ...

  5. javascript学习(三) 内置对象

    一:事件(Event)对象 在触发dom事件的时候都会产生一个event对象 type   获取事件类型 target  获取事件目标 stopPropagation()  阻止事件冒泡 preven ...

  6. 过滤DataTable中的空数据

    DataTable dt = new DataTable(tableName); for (int i = 0; i < columnsNames.Length; i++) { dt.Colum ...

  7. 栈——PowerShell版

    上一篇讲过队列(queue),队列就像是居民楼里的垃圾管道,从楼道的垃圾管道的入口处将垃圾扔进去,清洁工会从一楼垃圾管道的出口处将垃圾拿走.每一层的垃圾通道入口与一楼的垃圾管道出口之间都形成了一个队列 ...

  8. ubuntu配置服务器环境

    今天环境不知道怎么就不能用了.自己新配了一个: 添加源: vi /etc/apt/sources.list 将下面这些源添加进去: deb http://debian.ustc.edu.cn/ubun ...

  9. Mysql-学习笔记(==》权限管理 十 三)

    -- 用户与权限管理-- 查看当前服务器上的所有账号密码主机SELECT USER,PASSWORD,HOST FROM mysql.user; -- 设置账号密码SET PASSWORD=PASSW ...

  10. 【Java】hashcode()和equals()

    大家知道,在集合中判断集合中的两个元素是否相同,依赖的是hashcode()和equals()两个方法. > 一个简单的实验 public class Teacher { private Int ...