传送门

网络流解混合图欧拉回路,以前xy讲过,但是我一直没写。

把无向边随意定向,每个点权值为出度减入度,权值为奇数无解,权值大于0的从s向其连权值/2的边,小于0的向t连-权值/2的边,原图中无向图按定向连u->v权值为1的边,跑网络流判断是否满流即可,原图中的满流边即为要取反的边。

这两天先悠闲地整理一下前几天学的内容,过两天再开始全力准备noip吧大概。。

 //Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct edge {
int u,v,cap,fl,nx;
edge(){}
edge(int u,int v,int cap,int fl,int nx):u(u),v(v),cap(cap),fl(fl),nx(nx){}
}e[N]; int ecnt=,fir[N];
void add(int u,int v,int cap) {
e[++ecnt]=edge(u,v,cap,,fir[u]); fir[u]=ecnt;
//printf("%d->%d:%d\n",u,v,cap);
e[++ecnt]=edge(v,u,,,fir[v]); fir[v]=ecnt;
} queue<int>que;
int d[N];
void bfs(int s,int t) {
que.push(t);
For(i,,n) d[i]=n;
d[t]=;
while(!que.empty()) {
int x=que.front();
que.pop();
for(int i=fir[x];i;i=e[i].nx) {
int y=e[i].v;
if(d[y]==n&&e[i].cap==) {
d[y]=d[x]+;
que.push(y);
}
}
}
} #define inf 1e9
int p[N];
int calc(int s,int t) {
int fl=inf;
for(int i=t;i!=s;i=e[p[i]].u)
fl=min(fl,e[p[i]].cap-e[p[i]].fl);
for(int i=t;i!=s;i=e[p[i]].u)
e[p[i]].fl+=fl,e[p[i]^].fl-=fl;
return fl;
} int c[N],cur[N];
int isap(int s,int t) {
For(i,,n) c[i]=;
bfs(s,t);
For(i,,n) cur[i]=fir[i],c[d[i]]++;
int rs=;
for(int x=s;d[x]<n;) {
if(x==t) {
rs+=calc(s,t);
x=s;
}
int ok=;
for(int &i=cur[x];i;i=e[i].nx) if(e[i].cap>e[i].fl&&d[e[i].v]+==d[x]) {
ok=; p[x=e[i].v]=i; break;
}
if(!ok) {
int D=n; cur[x]=fir[x];
for(int i=fir[x];i;i=e[i].nx) if(e[i].cap>e[i].fl)
D=min(D,d[e[i].v]+);
if(!(--c[d[x]])) break;
c[d[x]=D]++;
if(x!=s) x=e[p[x]].u;
}
}
return rs;
} int dd[N];
vector<int>vc;
void init() {
ecnt=;
memset(fir,,sizeof(fir));
memset(dd,,sizeof(dd));
} int main() {
#ifdef ANS
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
int T; read(T);
while(T--) {
init();
read(n); read(m);
For(i,,m) {
int u,v,w;
read(u); read(v); read(w);
dd[u]++; dd[v]--;
if(!w) add(u,v,);
}
int s=n+,t=n+,fl=; n+=;
For(i,,n-) {
if(dd[i]&) { fl=; break; }
if(dd[i]>) add(s,i,dd[i]/);
if(dd[i]<) add(i,t,(-dd[i])/);
if(dd[i]!=) vc.push_back(ecnt-);
}
isap(s,t);
int up=vc.size();
For(i,,up-) if(e[vc[i]].fl!=e[vc[i]].cap) {
fl=; break;
} vc.clear();
if(fl) puts("impossible");
else puts("possible");
}
Formylove;
}

最新文章

  1. 人工智能 - AI
  2. 使用getopt_long来解析参数的小函数模板
  3. sql-将一个表中的数导入另一个表中
  4. tomcat配置SSL证书(使用startSSL申请到的证书)
  5. js工具类大全
  6. HDU-4514 湫湫系列故事——设计风景线 手动扩栈
  7. node io.sockt 聊天应用
  8. [HIHO1328]逃离迷宫(bfs,位压)
  9. linux中fork()函数详解(转)
  10. Java流
  11. POPTEST老李分享session,cookie的安全性以及区别 3
  12. 通过decorators = [,] 的形式给类中的所有方法添加装饰器
  13. angular,vue,react的基本语法—双向数据绑定、条件渲染、列表渲染、angular小案例
  14. C#水晶报表教程
  15. logical_backup: expdp/impdp
  16. 使用kubeadm部署kubernetes1.9.1+coredns+kube-router(ipvs)高可用集群
  17. [原][译][physX]phsyX3.3.4官方文档物理引擎基本概念和例子介绍
  18. 近中期3D编程研究目标
  19. 新机器连接老机器遇到的ERROR
  20. AD芯片的基准参考电压问题

热门文章

  1. leetcode-160周赛-5241-铺瓷砖
  2. php时间时间戳
  3. NOIP模拟测试18(T3待更新)
  4. html常用标签梳理
  5. 使用pangolin库画出轨迹
  6. 【系统安全性】二、Web攻击与防范
  7. debian 8 安装 codeblocks
  8. Linux中断机制
  9. iptables防DDOS攻击和CC攻击配置
  10. AndroidFine Error:Annotation processors must be explicitly declared now.