SPOJ 962 网络流
来源:互联网 发布:ps软件源码下载 编辑:程序博客网 时间:2024/06/05 02:13
题目大意:有一个图,n个点,m条边。以1为起点,先到2,最后到3,且每个点最多只经过一次。问,能否有这样的路径。
最开始,我老是想着以1为起点,拆点十分麻烦。后来发现,只要以2为源点,1、3为汇点就好了。
这题值得吐槽的是,m似乎大于50011。输入的边的信息中的u,v。有的u、v似乎大于n,这些边是不要的........
//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<cmath>#include<cctype>#include<string>#include<algorithm>#include<iostream>#include<ctime>#include<map>#include<set>using namespace std;#define MP(x,y) make_pair((x),(y))#define PB(x) push_back(x)typedef long long LL;//typedef unsigned __int64 ULL;/* ****************** */const int INF=1000111222;const double INFF=1e100;const double eps=1e-8;const LL mod=1000000007;const int NN=30110*2;const int MM=401010;/* ****************** */struct G{ int v,cap,next;}E[MM+NN];int p[NN],T;int tp[NN],dd[NN],qw[NN];void add(int u,int v,int f){ E[T].v=v; E[T].cap=1; E[T].next=p[u]; p[u]=T++; E[T].v=u; E[T].cap=0; E[T].next=p[v]; p[v]=T++;}bool find_path(int st,int en,int n){ int u,v,i,head,tail; for(i=1;i<=n;i++) dd[i]=-1; qw[head=tail=0]=st; dd[st]=0; while(head<=tail) { u=qw[head++]; for(i=p[u];i+1;i=E[i].next) { v=E[i].v; if(dd[v]==-1 && E[i].cap>0) { dd[v]=dd[u]+1; qw[++tail]=v; } } } return (dd[en]!=-1);}int dfs_flow(int u,int &en,int f){ if(u==en || f==0) return f; int temp,flow=0; for( ; tp[u]+1 ; tp[u]=E[ tp[u] ].next) { G &e=E[ tp[u] ]; if(dd[e.v]==dd[u]+1) { temp=dfs_flow(e.v,en,min(f,e.cap)); if(temp>0) { e.cap-=temp; E[tp[u]^1].cap+=temp; f-=temp; flow+=temp; if(f==0) break; } } } return flow;}int dinic(int st,int en,int n){ int i,ans=0; while( find_path(st,en,n) ) { for(i=1;i<=n;i++) tp[i]=p[i]; ans+=dfs_flow(st,en,2); } return ans;}int main(){ int cas; int n,m,u,v,i; bool fg; scanf("%d",&cas); while(cas--) { memset(p,-1,sizeof(p)); T=0; scanf("%d%d",&n,&m);/* if(m>50011) { while(1); }*/ while(m--) { scanf("%d%d",&u,&v); if(u>n || v>n) continue; add(u+n,v,1); add(v+n,u,1); } for(i=1;i<=n;i++) { add(i,i+n,1); } add(1+n,n+n+1,1); add(3+n,n+n+1,1); if(n>2 && dinic(2+n,n+n+1,n+n+1)>=2) fg=true; else fg=false; if(fg) puts("YES"); else puts("NO"); } return 0;}
0 0
- SPOJ 962 网络流
- SPOJ 962 Intergalactic Map (网络最大流)
- SPOJ 962 Intergalactic Map (网络流)
- SPOJ 13041 网络流+二分
- SPOJ IM 962 网络流最大流 解题报告
- SPOJ Smart Network Administrator(二分+网络流)
- SPOJ 287 网络流最大流+二分答案 解题报告
- SPOJ 287 Smart Network Administrator 网络流、二分答案
- SPOJ 287 Smart Network Administrator (网络流)
- SPOJ 1693 网络流最小割 解题报告
- BZOJ 2400: Spoj 839 Optimal Marks 网络流
- SPOJ 287 Smart Network Administrator 二分+网络最大流
- SPOJ 962 Intergalactic Map 最大流
- SPOJ 962 IM
- SPOJ 13041 BNU 28769 The Black Riders 二分+网络流 建图
- spoj spoj839 Optimal Marks 网络流 最小割 附数据生成器
- SPOJ NETADMIN 最大流
- SPOJ
- mongoDB的MapReduce简介
- 系统到底是什么?
- codeforces 239 (div2) A B C D
- PC110304/UVA850
- 颜色迁移之三——Welsh经典算法
- SPOJ 962 网络流
- 一个页面多个倒计时 js
- 一步一步学习openfire+spark(2)——介绍几个概念
- C++参数传递的三种方式
- 给大家下载csdn资料
- GitHub使用教程
- 一个http请求的详细过程
- 2014-03-30工作日志:我的编程风格
- 在Ubuntu上安装JDK6