http://www.cnblogs.com/looker_acm/archive/2010/08/15/1799919.html

/*
** 混合图欧拉回路
** 只记录各定点的出度与入度之差,有向边无用丢弃,将无向边定向,在网络中建立流量为1的边
** 另新建s和t。对于入 > 出的点u,连接边(u, t)、容量为x,对于出 > 入的点v,连接边(s, v),
** 容量为x(注意对不同的点x不同)。之后,察看是否有满流的分配,如果是满流则存在,否则不存在
*/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
const int maxn = 300;
const int maxm = maxn*10;
struct node{
int v,next,flow;
}edge[maxm];
int head[maxn],dis[maxn],deg[maxn];
int id,source,sink;
void add_edge(int u,int v,int flow){
edge[id].v = v;edge[id].flow = flow;edge[id].next = head[u];head[u] = id++;
edge[id].v = u;edge[id].flow = 0 ;edge[id].next = head[v];head[v] = id++;
}
bool spfa(){
memset(dis,-1,sizeof(dis));
dis[source] = 0;
queue<int>que;
que.push(source);
while(!que.empty()){
int u = que.front();
que.pop();
for(int id = head[u]; id != -1; id = edge[id].next){
int v = edge[id].v;
if( edge[id].flow > 0 && dis[v] == -1){
dis[v] = dis[u] + 1;
que.push(v);
}
}
}
return dis[sink] != -1;
} int dinic(int u,int flow){
if( u == sink)return flow;
int tmp = flow;
for(int id = head[u]; id != -1; id = edge[id].next){
int v = edge[id].v;
if( edge[id].flow > 0 && dis[v] == dis[u] + 1){
int tt = dinic(v,min(edge[id].flow ,tmp));
tmp -= tt;
edge[id].flow -= tt;
edge[id^1].flow += tt;
if( tmp == 0)return flow;
}
}
return flow - tmp;
}
int get_max(){
int max_flow = 0;
while( spfa())
max_flow += dinic(source,100000);
return max_flow;
}
int main(){
int t,n,m;
int u,v,d;
scanf("%d",&t);
while( t-- ){
scanf("%d%d",&n,&m);
for(int i = 0; i <= n+1; i++)
deg[i] = 0,head[i] = -1;
id = source = 0;sink = n+1;
while( m-- ){
scanf("%d%d%d",&u,&v,&d);
if( u == v)continue;
deg[u]++,deg[v]--;
if( d == 0)add_edge(u,v,1);
}
bool flg = false;
int ans = 0;
for(int i = 1;i <= n; i++){
if( deg[i]%2 ){flg = true;break;}
deg[i] /= 2;
if( deg[i] > 0){
ans += deg[i];
add_edge(source,i,deg[i]);
}
else
add_edge(i,sink,-deg[i]);
}
if( flg || ans != get_max())puts("impossible");
else puts("possible"); }
return 0;
}

最新文章

  1. swift 学习笔记[1]
  2. ubuntu16.04 NVIDIA显卡驱动安装
  3. asp.net 上一条和下一条记录的显示
  4. 【云计算】开源的Docker Registry WebUI
  5. Mac OS X 安装并测试 OpenCV
  6. InstallShield: cannot extract icon with index 0错误解决方案
  7. python 查看文件夹权限组和用OS模块操作文件夹
  8. 现代编译原理——第六章:中间树 IR Tree 含源码
  9. (二 -3-1) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列 esp8266程序
  10. MySQL简介及安装
  11. Java图片合并
  12. 什么是CPU密集型、IO密集型?
  13. Singer 学习七 运行&amp;&amp;开发taps、targets (二 targets 运行说明)
  14. ini_set的权限大于error_reporting
  15. sql server 将时间中的时分秒改为00:00:00
  16. [WPF]实现密码框的密码绑定
  17. django允许外部访问
  18. Linux之安装软件
  19. 我的PHPMailer_v5.1 使用
  20. CentOS 进程操作

热门文章

  1. Shell基本语法---shell的变量以及常见符号
  2. python 感悟
  3. spring boot 学习笔记(二)之打包
  4. JavaSE(一)Java程序的三个基本规则-组织形式,编译运行,命名规则
  5. 利用模板生成html页面(NVelocity)
  6. CSS等分布局方法
  7. APP启动优化
  8. 页面性能监控之performance
  9. C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)
  10. 码农&quot;混子&quot;的思想转变