QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#623945 | #8943. Challenge Matrix Multiplication | Coffins | TL | 0ms | 0kb | C++14 | 1.5kb | 2024-10-09 14:26:28 | 2024-10-09 14:26:30 |
answer
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
using pii=pair<int,int>;
int n,m,ct=0;vector<int> edge[N];
int deg[N];set<pii> s;
int fr[N];vector<int> vc;
bool vs[N];int f[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;cin>>x>>y;
edge[x].push_back(y);
deg[x]++,deg[y]--;
}for(int i=1;i<=n;i++)
ct+=abs(deg[i]),s.insert({-deg[i],i});
while(1)
{
int tot=0;for(int i=1;i<=n;i++)
tot+=!f[i];if(!tot)continue;
int u=s.begin()->second,v=u;
for(int i=1;i<=n;i++)fr[i]=0;
queue<int> q;q.push(u);vc.clear();
while(!q.empty())
{
int u=q.front();q.pop();
if(deg[u]<0){v=u;break;}
for(auto v:edge[u])
if(!fr[v])fr[v]=u,q.push(v);
}s.erase({-deg[u],u}),deg[u]--;
s.insert({-deg[u],u});
s.erase({-deg[v],v}),deg[v]++;
s.insert({-deg[v],v});
while(v!=u)vc.push_back(v),
v=fr[v];vc.push_back(u);
int sz=vc.size(),ct=0;
while(!q.empty())q.pop();
for(int i=1;i<=n;i++)vs[i]=0;
for(int i=0;i<sz;i++)
{
q.push(vc[i]);vs[vc[i]]=1;
while(!q.empty())
{
int u=q.front();
ct++;q.pop();
for(auto v:edge[u])
if(!vs[v])q.push(v),vs[v]=1;
}f[vc[i]]=ct;
}
}for(int i=1;i<=n;i++)cout<<f[i]<<' ';
cout<<'\n';return 0;
}
详细
Test #1:
score: 0
Time Limit Exceeded
input:
4 6 1 3 2 3 2 4 1 2 1 3 1 3