题意:

  给你一个带权有向图,选择一些边组成许多没有公共边的环,使每个点都在k个环上,要求代价最小。

SOL:

  现在已经养成了这种习惯,偏题怪题都往网络流上想。。。

  怎么做这题呢。。。

  对我们看到每个点都在k个环上,而且没有公共边,那么很显然每个点的入度出度都为k.   然后我们拆点,建源汇ST,S与每个入点连边容量为k,出点与汇点相连容量为k,费用为0,如果城市i,j之间有边那么将i的入点和j的出点连一条费用为权,容量为1的边.然后跑一遍费用流.如果每条边都满流那么就有解.

  好神奇...从环变成一个二分图...然后从毫无头绪变成一个费用流...又觉得智商被碾压了.

  写代码因为spfa的时候出队结点没重置...然后一直wa...日了狗了...

  更加理解spfa了....(无奈

Code:

  

/*==========================================================================
# Last modified: 2016-03-10 20:55
# Filename: uva2197.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector> #define lowbit(x) (x)&(-x)
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define getlc(a) ch[(a)][0]
#define getrc(a) ch[(a)][1] #define maxn 100000
#define maxm 100000
#define pi 3.1415926535898
#define _e 2.718281828459
#define INF 1070000000
using namespace std;
typedef long long ll;
typedef unsigned long long ull; template<class T> inline
void read(T& num) {
bool start=false,neg=false;
char c;
num=0;
while((c=getchar())!=EOF) {
if(c=='-') start=neg=true;
else if(c>='0' && c<='9') {
start=true;
num=num*10+c-'0';
} else if(start) break;
}
if(neg) num=-num;
}
/*==================split line==================*/
struct Edge{
int from,to,c,cap;
}e[maxm];
int dis[maxn],first[maxn],next[maxm],from[maxn];
bool inq[maxn];
int sume,n,m,k,S,T,f,ans;
void addedge(int x,int y,int c,int cap){
sume++; e[sume].from=x; e[sume].to=y; e[sume].c=c; e[sume].cap=cap;
next[sume]=first[x]; first[x]=sume;
sume++; e[sume].from=y; e[sume].to=x; e[sume].c=-c; e[sume].cap=0;
next[sume]=first[y]; first[y]=sume;
}
bool spfa(){
FORP(i,S,T) dis[i]=INF;
memset(inq,false,sizeof(inq));
queue<int> q;
dis[S]=0; inq[S]=true; q.push(S);
while (!q.empty()){
int now=q.front(); q.pop(); inq[now]=false;
for (int i=first[now];i;i=next[i])
if (dis[e[i].to]>dis[now]+e[i].c && e[i].cap){
dis[e[i].to]=dis[now]+e[i].c; from[e[i].to]=i;
if (!inq[e[i].to]){
inq[e[i].to]=true;
q.push(e[i].to);
}
}
}
return dis[T]==INF?false:true;
}
void mincost(){
int i=from[T],x=INF;
while (i){
x=min(x,e[i].cap);
i=from[e[i].from];
}
f+=x; i=from[T];
while (i){
//ans+=(x*e[i].c);
e[i].cap-=x; e[i^1].cap+=x;
i=from[e[i].from];
}
ans+=dis[T]*x;
}
void init(){
ans=0; memset(first,0,sizeof(first));
f=0; sume=1;
read(n); read(m); read(k);
S=0; T=n+n+2;
FORP(i,1,n) {
addedge(S,i,0,k); addedge(i+n,T,0,k);
}
//FORP(i,1,n) addedge(i,i+n,
FORP(i,1,m){
int u,v,w;
read(u);read(v);read(w);
u++; v++;
addedge(u,v+n,w,1);
}
}
void work(){
int ans=0;
while (spfa()) mincost();
}
void print(){
bool flag=true;
//FORP(i,2,sume) if (e[i].cap>0) {flag=false; break;}
if (f<n*k) flag=false;
if (!flag) printf("-1\n");
else printf("%d\n",ans);
}
int main(){
int cas; read(cas);
while (cas--){
init();
work();
print();
}
}

UVa 2197 & 拆点分环费用流的更多相关文章

  1. hdu 1853(拆点判环+费用流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  2. 洛谷 P2045 方格取数加强版【费用流】

        题目链接:https://www.luogu.org/problemnew/show/P2045 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现 ...

  3. 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】

    (题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...

  4. Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负

    /** 题目:Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负 链接:https://vjudge.net/problem/UVA-1161 ...

  5. 【 UVALive - 2197】Paint the Roads(上下界费用流)

    Description In a country there are n cities connected by m one way roads. You can paint any of these ...

  6. POJ 2175 Evacuation Plan (费用流,负环,消圈法,SPFA)

    http://poj.org/problem?id=2175 Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  7. CF 277E Binary Tree on Plane (拆点 + 费用流) (KM也可做)

    题目大意: 平面上有n个点,两两不同.现在给出二叉树的定义,要求树边一定是从上指向下,即从y坐标大的点指向小的点,并且每个结点至多有两个儿子.现在让你求给出的这些点是否能构成一棵二叉树,如果能,使二叉 ...

  8. HDU 4780 Candy Factory(拆点费用流)

    Problem Description   A new candy factory opens in pku-town. The factory import M machines to produc ...

  9. BZOJ 1877 晨跑 拆点费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1877 题目大意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧 ...

随机推荐

  1. HTML5 – 1.基础

    新网页结构 1.<header> 定义了文档的头部区域 2.<nav>标签定义导航链接的部分. 3.<article>定义页面独立的内容区域. 4.<sect ...

  2. 【翻译二十一】java-并发之分拆和合并

    Fork/Join This section was updated to reflect features and conventions of the upcoming Java SE 8 rel ...

  3. java中 this 和super的用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...

  4. 第十篇:扩展SOUI的控件及绘图对象(ISkinObj)

    尽管SOUI已经内置了大部分常用的控件,很显然内置控件很难满足各种应用的形式各异的需求. 因此只有提供足够的扩展性才能满足真实应用场景. 除了将系统尽可能的组件化外,SOUI在控件自绘(SWindow ...

  5. V for Vendetta

    V for Vendetta V字仇杀队 复仇者V 安迪·沃卓斯基 and Larry Wachowski 思想,是最强大的武器.因为,世界上的独裁政府,有一个共同特点就是推行洗脑和愚民政策. 经典台 ...

  6. loj 1429(可相交的最小路径覆盖)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...

  7. css把超出的部分显示为省略号的方法兼容火狐

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  8. Arduino101学习笔记(六)—— 高级IO

    1.位移输出函数(8位) 输入value数据后Arduino会自动把数据移动分配到8个并行输出端. 其中dataPin为连接DS的引脚号, clockPin为连接SH_CP的引脚号, bitOrder ...

  9. (转载)RTorrent 命令行使用说明

    转自:http://blog.chinaunix.net/uid-22457844-id-2973262.html 参考:http://forum.ubuntu.org.cn/viewtopic.ph ...

  10. mysql注入小测试

    转自:http://www.jb51.net/article/46163.htm 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常,用户可以通过以下接口调用数据库的内容:URL地址栏 ...