hdu 5294 Tricks Device
中规中矩的做法,第二发SAP。贴一发留恋。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> using namespace std; const int INF=0x3f3f3f3f; const int maxn=2008; struct fuck{int v,w;bool operator<(const fuck &a) const{return w>a.w;} }; struct shit{int u,v,cap,flow,next; }edge[maxn<<6]; vector<fuck> g[maxn]; vector<int> distree[maxn]; int dis[maxn],bitch[maxn],head[maxn]; bool vis[maxn]; int tol=0,len; void init() {tol=0;len=1;memset(head,-1,sizeof(head)); } void addedge(int u,int v,int w) {edge[tol].u=u;edge[tol].v=v;edge[tol].cap=w;edge[tol].flow=0;edge[tol].next=head[u];head[u]=tol++;edge[tol].u=v;edge[tol].v=u;edge[tol].cap=0;edge[tol].flow=0;edge[tol].next=head[v];head[v]=tol++; } void dfs(int u) {int v;for(int i=0;i<distree[u].size();i++){v=distree[u][i];addedge(u,v,1);if(vis[v]) continue;vis[v]=true;len++;dfs(v);} } void dij(int n) {priority_queue<fuck> q;int u,v,i,w;fuck pp;memset(dis,INF,sizeof(dis));memset(vis,false,sizeof(vis));pp.v=1;pp.w=0;bitch[1]=0;dis[1]=0;q.push(pp);while(!q.empty()){pp=q.top();q.pop();u=pp.v;if(vis[u]) continue;vis[u]=true;for(i=0;i<g[u].size();i++){v=g[u][i].v;w=g[u][i].w;if(dis[v]>=dis[u]+w){if(dis[v]==dis[u]+w){if(bitch[v]>bitch[u]+1)bitch[v]=bitch[u]+1;distree[v].push_back(u);}else{dis[v]=dis[u]+w;bitch[v]=bitch[u]+1;pp.w=dis[v];pp.v=v;q.push(pp);distree[v].clear();distree[v].push_back(u);}}}} } int dep[maxn],gap[maxn]; void bfs(int start,int last) {memset(dep,-1,sizeof(dep));memset(gap,0,sizeof(gap));queue<int> q;q.push(last);dep[last]=0;gap[0]=1;int i,u,v;while(!q.empty()){u=q.front();q.pop();for(i=head[u];i!=-1;i=edge[i].next){v=edge[i].v;if(edge[i].cap!=edge[i].flow||dep[v]!=-1) continue;q.push(v);dep[v]=dep[u]+1;++gap[dep[v]];}} } int sap(int start,int last) {int max_flow=0,i,u,v,w;bfs(start,last);int cur[maxn];int S[maxn];int top=0;for(i=last;i<=start;i++)cur[i]=head[i];u=start;while(dep[start]<=len){if(u==last){int temp=INF;int inser;for(i=0;i<top;i++)if(temp>edge[S[i]].cap-edge[S[i]].flow){temp=edge[S[i]].cap-edge[S[i]].flow;inser=i;}for(i=0;i<top;i++){edge[S[i]].flow+=temp;edge[S[i]^1].flow-=temp;}max_flow+=temp;top=inser;u=edge[S[top]].u;}if(u!=last&&gap[dep[u]-1]==0) break;for(i=cur[u];i!=-1;i=edge[i].next)if(edge[i].cap>edge[i].flow&&dep[u]==dep[edge[i].v]+1)break;if(i!=-1){cur[u]=i;S[top++]=i;u=edge[i].v;}else{int mi=len+1;for(i=head[u];i!=-1;i=edge[i].next){if(edge[i].cap==edge[i].flow) continue;if(mi>dep[edge[i].v]){mi=dep[edge[i].v];cur[u]=i;}}--gap[dep[u]];dep[u]=mi+1;++gap[dep[u]];if(u!=start) u=edge[S[--top]].u;}}return max_flow; } int main() {int i,j,n,m,u,v,w;fuck pp;//freopen("1007.in","r",stdin);//freopen("fuck.txt","w",stdout);while(scanf("%d%d",&n,&m)==2){for(i=0;i<=n;i++){g[i].clear();distree[i].clear();}init();for(i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);pp.v=v;pp.w=w;g[u].push_back(pp);pp.v=u;g[v].push_back(pp);}dij(n);memset(vis,false,sizeof(vis));vis[n]=true;dfs(n);int y=sap(n,1);printf("%d %d\n",y,m-bitch[n]);}return 0; }
转载于:https://www.cnblogs.com/bitch1319453/p/4751014.html
hdu 5294 Tricks Device相关推荐
- HDU 5294 Tricks Device(最短路+最大流)
题意:给一个无向图(连通的),张在第n个点,吴在第1个点,'吴'只能通过最短路才能到达'张',两个问题:(1)张最少毁掉多少条边后,吴不可到达张(2)吴在张毁掉最多多少条边后仍能到达张. 思路:将所有 ...
- Tricks Device 最短路+最大流
http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1006&ojid=0&cid=12578&hide= ...
- 【HDU - 5917】Instability(规律,结论,Ramsey定理,知识点,tricks)
题干: Long long ago, there was a prosperous kingdom which consisted of n cities and every two cites we ...
- 【HDU - 5492】Find a path(dp,tricks)
题干: Frog fell into a maze. This maze is a rectangle containing NN rows and MM columns. Each grid in ...
- 【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)
题干: There are some locations in a park, and some of them are connected by roads. The park manger nee ...
- 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)
题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...
- 【HDU - 6349】三原色图(最小生成树,思维,tricks)
题干: 度度熊有一张 nn 个点 mm 条边的无向图,所有点按照 1,2,⋯,n1,2,⋯,n 标号,每条边有一个正整数权值以及一种色光三原色红.绿.蓝之一的颜色. 现在度度熊想选出恰好 kk 条边, ...
- 【HDU - 5884】Sort(k叉哈夫曼树,优化tricks,两个队列代替优先队列)
题干: Recently, Bob has just learnt a naive sorting algorithm: merge sort. Now, Bob receives a task fr ...
- 【HDU - 4786 】Fibonacci Tree (最小生成树变形,上下界贪心,tricks)
题干: Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on ...
最新文章
- 如何辨别二逼、文艺互联网公司?
- SAP RETAIL 特征参数文件(Characteristic Profile) III
- 人工智能会取代科学家吗
- 【arduino】nodemcu(ESP8266)发送邮件库测试笔记,SMTP email
- python控制autocad_利用python控制Autocad:pyautocad方式
- 【转】在你的博客中添加Google地图(Use Google Map API On Your Bolg)
- 工作83:wacch的使用
- r语言简介_R语言简介
- UVa 10118 免费糖果(记忆化搜索+哈希)
- Ubuntu Desktop 变为 Ubuntu Server 服务器版的方法
- USB转TTL(CH340)模块使用
- zip和unzip命令使用
- 使用GenyMotion模拟器+抓包工具SRSniffer分析网络请求
- Unity之IL2CPP
- matlab 画图 方程,matlab 画图与解方程
- 20个最棒的英文电子书免费下载网站
- centos7安装mysql5.7步骤(图解版)
- 程序员为什么更容易掉头发?
- 俞军:百度首席产品架构师
- android吃鸡闪退,绝地求生刺激战场iPhone6/6P闪退怎么办
热门文章
- 错误解决记录------------mysql连接本地数据库显示can't get hostname for your address
- 《C++面向对象高效编程(第2版)》——3.13 采用语义
- centos7安装Samba服务
- 使用CSS3实现超炫的Loading(加载)动画效果
- 远程访问×××——Easy ×××
- Oracle Flashback Database and Restore Points 说明
- 开心网外挂开发之 XML序列化于反序列化
- php获取post表单数据_PHP如何通过post方法来获取form表单中数据?(代码示例)
- java菜单实现功能_Java实现超市库存管理系统
- ar编码matlab仿真_matlab-ofdm通信链路仿真