QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#65691 | #3805. Promotions | kanner | WA | 8ms | 6108kb | C++14 | 3.1kb | 2022-12-03 00:15:55 | 2022-12-03 00:15:58 |
Judging History
answer
//https://onlinejudge.org/external/130/13015.pdf
//13015
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;
int bfs(vector<pair<set<int>, vector<int>>>graph, vector<int>&roots, vector<int>visits, int ttl, set<int>&conj){ //pasamos una copia del grafo, y estructura de visitados, ya que los modificamos y no hacemos llamados recursivos
int i, ans = 0, node, auxNode, size = 0;
queue<int>q;
for(i = 0; i<roots.size(); i++){ //identificamos los nodos raiz
if(roots[i] == 0){
q.push(i);
ans+=1;
visits[i] = true;
conj.insert(i);
}
}
if(ans > ttl){
return 0;//no es posible desde el primer nivel
}
q.push(-1); //level
while(!q.empty()){
node = q.front();
q.pop();
if(node == -1){ //cada vez que encontramos un nuevo nivel, evaluamos si la cantidad de empleados ascendidos es menor o igual al limite
if(ans+size > ttl){
return ans; //si no es posible retornamos lo calculado en los anteriores niveles
}
else if(!q.empty()){//evaluamos si aun se puede seguir, o hay otro nivel y aun hay empleados por ascender
q.push(-1);
ans+=size;
size = 0;
}
}
else{
for(i = 0; i<graph[node].second.size(); i++){
auxNode = graph[node].second[i];
if(visits[auxNode] == false){
if(graph[auxNode].first.size() == 1){//evaluamos si tiene un solo predecesor
visits[auxNode] = true;
size++;
q.push(auxNode);
if(ans + size <= ttl){//evaluamos si es imposible llegar a ese nodo
conj.insert(auxNode);
}
}
graph[auxNode].first.erase(node);//al llevar desde un predecesor, lo elimnamos, hasta que solo dependa de 1
}
}
}
}
return ans;
}
int main(){
int A, B, employees, precedence, employe1, employe2, ans, i;
while(scanf("%i %i %i %i", &A, &B, &employees, &precedence) != EOF){
set<int>conj;
vector<pair<set<int>, vector<int>>>graph(employees);
vector<int>roots(employees, 0);
vector<int>visits(employees, false);
while(precedence--){
scanf("%i %i", &employe1, &employe2);
graph[employe2].first.insert(employe1);//guardamos los predecesores
graph[employe1].second.push_back(employe2);
roots[employe2] = -1; //cambiamos el estado a -1, ya que al ser un nodo que se puede visitar, no es una raiz
}
cout<<bfs(graph, roots, visits, A, conj)<<endl;
cout<<bfs(graph, roots, visits, B, conj)<<endl;
cout<<employees-conj.size()<<endl;
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 3312kb
input:
3 4 7 8 0 4 1 2 1 5 5 2 6 4 0 1 2 3 4 5
output:
2 4 3
result:
ok 3 lines
Test #2:
score: -100
Wrong Answer
time: 8ms
memory: 6108kb
input:
3000 3500 5000 20000 1756 555 4733 3690 2912 2765 1233 1405 2822 1013 1664 4643 465 3265 3133 3063 2592 2060 2540 3030 209 2208 2708 3115 4839 463 9 3672 3446 2864 198 3985 1947 3892 1312 4255 130 485 3183 3653 1081 72 1730 3727 1017 1731 2494 4156 4826 2405 984 3653 4649 3164 929 4453 4163 4336 80 ...
output:
2898 3335 1500
result:
wrong answer 1st lines differ - expected: '1', found: '2898'