QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#874024 | #1814. Kingdoms and Quarantine | qwqUwU_ | TL | 1ms | 4224kb | C++14 | 3.4kb | 2025-01-27 12:01:55 | 2025-01-27 12:01:56 |
Judging History
answer
#include<bits/stdc++.h>
#define pb push_back
#define P make_pair
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
inline ll read(){
ll x=0,f=1,c=getchar();
while(c<'0'||c>'9')f=(c=='-'?-1:1),c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
const int N=6010;
int n1,n2,m;
pii eg[N];
bool D[N],vis[N];
namespace sub1{
int d[N];
struct Node{int to,nxt,fl,c;}edge[N<<3];
int head[N],tt=1;
inline void ad(int u,int v,int w,int c){
edge[++tt]={v,head[u],w,c};head[u]=tt;
edge[++tt]={u,head[v],0,-c};head[v]=tt;
}
int dis[N],pre[N],incf[N];
inline bool spfa(int s,int t){
rep(i,1,n1+n2+4)dis[i]=1<<30,pre[i]=0,incf[i]=0;
queue<int>q;q.push(s);
dis[s]=0,incf[s]=1<<30;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].nxt)if(edge[i].fl){
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].c){
dis[v]=dis[u]+edge[i].c;
incf[v]=min(incf[u],edge[i].fl);
pre[v]=i;
q.push(v);
}
}
}
return pre[t];
}
inline void MCMF(int s,int t,bool fl=0){
while(spfa(s,t)){
if(fl&&dis[t]>0)return;
for(int u=t;u!=s;){
int i=pre[u];
edge[i].fl-=incf[t];
edge[i^1].fl+=incf[t];
u=edge[i^1].to;
}
}
}
inline void solve(){
rep(i,1,m){
int x=eg[i].fi,y=eg[i].se;
if(D[x]^D[y])swap(x,y);
--d[x],++d[y];
ad(y,x,1,1);
}
int s=n1+n2+1,t=n1+n2+2,S=n1+n2+3,T=n1+n2+4;
rep(i,1,n1)ad(s,i,1,0);
rep(i,n1+1,n1+n2)ad(i,t,1,0);
rep(i,1,n1+n2){
if(d[i]>0)ad(S,i,d[i],0);
if(d[i]<0)ad(i,T,-d[i],0);
}
ad(t,s,1<<30,0);
MCMF(S,T);
edge[tt].fl=edge[tt-1].fl=0;
MCMF(s,t,1);
int cnt=0;
rep(i,1,m)if(edge[i<<1].fl)vis[i]=1,++cnt;
printf("%d\n",cnt);
}
}
vector<pii>G[N];
bool flag;
int dfn[N],F[N],ct;
bool inq[N];
vector<int>vec,ve[N];
inline void dfs(int u,int fa){
if(flag)return;
inq[u]=1;dfn[u]=1;
F[u]=fa;
for(pii A:G[u])if(vis[A.se]){
int v=A.fi;
if(!dfn[v])dfs(v,A.se);
else if(inq[v]){
if(flag)return;
vector<int>&B=ve[++ct];
flag=1;
if(D[u]==D[v])B.pb(A.se);
for(int w=u;w!=v;w=eg[F[w]].fi)B.pb(F[w]);
if(D[u]!=D[v])B.pb(A.se);
return ;
}
}
inq[u]=0;
}
inline void dfs(int u){
for(pii A:G[u])if(vis[A.se]){
int v=A.fi;
ve[ct].pb(A.se);
vis[A.se]=0;
dfs(v);
return;
}
}
int main() {
//freopen("data.in", "r", stdin);
//freopen("myans.out","w",stdout);
n1=read(),n2=read(),m=read();
rep(i,1,m){
int x=read(),y=read();
eg[i]=P(x,y);
D[x]^=1,D[y]^=1;
}
sub1::solve();
rep(i,1,m)if(vis[i]){
int &x=eg[i].fi,&y=eg[i].se;
if(D[x]^D[y])swap(y,x);
G[x].pb(P(y,i));
}
while(1){
flag=0;
rep(i,1,n1+n2)dfn[i]=inq[i]=F[i]=0;
rep(i,1,n1+n2)if(!dfn[i])dfs(i,0);
if(!flag)break;
for(int i:ve[ct])vis[i]=0;
}
//cerr<<ct<<endl;
while(1){
static int in[N],out[N];
rep(i,1,n1+n2)in[i]=out[i]=0;
flag=1;
rep(i,1,n1+n2)for(pii A:G[i])if(vis[A.se]){
++out[i];
flag=0,in[A.fi]=1;
}
if(flag)break;
rep(p,1,n1+n2)if(!in[p]){++ct;dfs(p);break;}
}
//cerr<<ct<<endl;
rep(i,1,ct){
int m=ve[i].size();
for(int j=0;j<m;j+=2)printf("%d ",ve[i][j]);
for(int j=1;j<m;j+=2)printf("%d ",ve[i][j]);
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 4224kb
input:
2 3 5 1 3 1 4 1 5 2 4 2 5
output:
3 4 1 2
result:
ok accepted
Test #2:
score: 0
Accepted
time: 0ms
memory: 4096kb
input:
1 2 2 1 2 1 3
output:
0
result:
ok accepted
Test #3:
score: 0
Accepted
time: 1ms
memory: 4096kb
input:
4 3 7 1 5 2 5 2 6 2 7 3 6 4 5 4 7
output:
5 2 7 4 6 1
result:
ok accepted
Test #4:
score: -100
Time Limit Exceeded
input:
10 10 20 2 11 2 17 1 12 8 14 9 15 10 12 9 13 1 18 3 15 2 14 2 16 7 13 8 15 8 20 9 12 6 13 8 16 6 11 4 20 6 16