中规中矩的做法,第二发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相关推荐

  1. HDU 5294 Tricks Device(最短路+最大流)

    题意:给一个无向图(连通的),张在第n个点,吴在第1个点,'吴'只能通过最短路才能到达'张',两个问题:(1)张最少毁掉多少条边后,吴不可到达张(2)吴在张毁掉最多多少条边后仍能到达张. 思路:将所有 ...

  2. Tricks Device 最短路+最大流

    http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1006&ojid=0&cid=12578&hide= ...

  3. 【HDU - 5917】Instability(规律,结论,Ramsey定理,知识点,tricks)

    题干: Long long ago, there was a prosperous kingdom which consisted of n cities and every two cites we ...

  4. 【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 ...

  5. 【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)

    题干: There are some locations in a park, and some of them are connected by roads. The park manger nee ...

  6. 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)

    题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...

  7. 【HDU - 6349】三原色图(最小生成树,思维,tricks)

    题干: 度度熊有一张 nn 个点 mm 条边的无向图,所有点按照 1,2,⋯,n1,2,⋯,n 标号,每条边有一个正整数权值以及一种色光三原色红.绿.蓝之一的颜色. 现在度度熊想选出恰好 kk 条边, ...

  8. 【HDU - 5884】Sort(k叉哈夫曼树,优化tricks,两个队列代替优先队列)

    题干: Recently, Bob has just learnt a naive sorting algorithm: merge sort. Now, Bob receives a task fr ...

  9. 【HDU - 4786 】Fibonacci Tree (最小生成树变形,上下界贪心,tricks)

    题干: Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on ...

最新文章

  1. 如何辨别二逼、文艺互联网公司?
  2. SAP RETAIL 特征参数文件(Characteristic Profile) III
  3. 人工智能会取代科学家吗
  4. 【arduino】nodemcu(ESP8266)发送邮件库测试笔记,SMTP email
  5. python控制autocad_利用python控制Autocad:pyautocad方式
  6. 【转】在你的博客中添加Google地图(Use Google Map API On Your Bolg)
  7. 工作83:wacch的使用
  8. r语言简介_R语言简介
  9. UVa 10118 免费糖果(记忆化搜索+哈希)
  10. Ubuntu Desktop 变为 Ubuntu Server 服务器版的方法
  11. USB转TTL(CH340)模块使用
  12. zip和unzip命令使用
  13. 使用GenyMotion模拟器+抓包工具SRSniffer分析网络请求
  14. Unity之IL2CPP
  15. matlab 画图 方程,matlab 画图与解方程
  16. 20个最棒的英文电子书免费下载网站
  17. centos7安装mysql5.7步骤(图解版)
  18. 程序员为什么更容易掉头发?
  19. 俞军:百度首席产品架构师
  20. android吃鸡闪退,绝地求生刺激战场iPhone6/6P闪退怎么办

热门文章

  1. 错误解决记录------------mysql连接本地数据库显示can't get hostname for your address
  2. 《C++面向对象高效编程(第2版)》——3.13 采用语义
  3. centos7安装Samba服务
  4. 使用CSS3实现超炫的Loading(加载)动画效果
  5. 远程访问×××——Easy ×××
  6. Oracle Flashback Database and Restore Points 说明
  7. 开心网外挂开发之 XML序列化于反序列化
  8. php获取post表单数据_PHP如何通过post方法来获取form表单中数据?(代码示例)
  9. java菜单实现功能_Java实现超市库存管理系统
  10. ar编码matlab仿真_matlab-ofdm通信链路仿真