要做这题,先要明白图的割,说白了就是 为了让原点无法到汇点要删几条边(之所以叫割,就是在图面上切一刀,减掉最小的边是原点和汇点成为两个集合),想到了割先放着一会用。

题中说只有沿最短路走才有可能追上,那么就意味着图中的最短路可能不止一条,沿着最短路走才能追上,那么其他的走法就没用了,所以只要求原点到汇点的最短路径图的最小割就可以知道最少断几条边可以堵住人了,再说第二问,既然最短路不止一条,那么只要边数量最小的一条最短路不被堵上,那个人就能追上炸弹张了,其他的边都可以赌上一点问题没有,这样就是总点数-最小最短路边数 等于第二问

写完交了几便都不对,逼的没招了去和题解,结果发现建图建错了!真是二逼的可以、、、、、、、、、、

   for(int i=;i<=n;i++)
{
for(int j=;j<g[i].size();j++)
{
edge e = g[i][j];
if(dis[e.to]-dis[i]==gg[i][e.to])
addedge(i,e.to,);
}

开始我是这么写的,后来我是这么写的

   for(int u = ; u <= n; u++) {
for(int i = ; i < g[u].size(); i++) {
int v = g[u][i].to, w = g[u][i].cap;
if(dis[u] + w == dis[v]) {
addedge(u, v, );
}
}
}

啥区别呢? 错的那个用了矩阵去访问边,但是点数和边数差那么多肯定是有重边的! 矩阵不能存重边!

AC代码,看见有人216ms ac   我就四百多、、、

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<queue>
#include<utility>
#define maxn 2001
#define inf 0xfffffff
using namespace std; typedef pair<int,int> P;
struct edge
{
int to,cap,rev;
};
vector<edge> group[maxn];
vector<edge> g[maxn];
int level[maxn],iter[maxn];
int dis[maxn],n,m,fro[maxn];
int vis[maxn],ans2;
int gg[maxn][maxn]; void dijkstra()
{
for(int i=;i<=n;i++)
{
dis[i]=inf;
}
dis[]=;
priority_queue<P,vector<P>, greater<P> > que;
que.push(P(,));
while(!que.empty())
{
P p=que.top();
que.pop();
int v=p.second;
if(dis[v]<p.first) continue;
for(int i=;i<g[v].size();i++)
{
edge e=g[v][i];
if(dis[e.to]>=dis[v]+e.cap)
{
dis[e.to]=dis[v]+e.cap;
que.push(P(dis[e.to],e.to));
}
}
}
}
void addedge(int from,int to,int cap)
{
group[from].push_back((edge){to,cap,group[to].size()});
group[to].push_back((edge){from,,group[from].size()-});
}
void build()
{
for(int u = ; u <= n; u++) {
for(int i = ; i < g[u].size(); i++) {
int v = g[u][i].to, w = g[u][i].cap;
if(dis[u] + w == dis[v]) {
addedge(u, v, );
}
}
}
/* for(int i=1;i<=n;i++)
{
for(int j=0;j<g[i].size();j++)
{
edge e = g[i][j];
if(dis[e.to]-dis[i]==gg[i][e.to])
addedge(i,e.to,1);
}
}*/
}
void bfs(int s)
{
memset(level,-,sizeof(level));
queue<int> que;
level[s] = ;
que.push(s);
while(!que.empty())
{
int v=que.front();
que.pop();
for(int i=;i<group[v].size();i++)
{
edge &e=group[v][i];
if(e.cap>&&level[e.to]<)
{
level[e.to]=level[v]+;
que.push(e.to);
}
}
}
}
int dfs(int v,int t,int f)
{
if(v == t) return f;
for(int &i=iter[v];i<group[v].size();i++)
{
edge &e=group[v][i];
if(e.cap>&&level[v]<level[e.to])
{
int d=dfs(e.to,t,min(f,e.cap));
if(d>)
{
e.cap -= d;
group[e.to][e.rev].cap +=d;
return d;
}
}
}
return ;
}
int max_flow(int s,int t)
{
int flow=;
while(true)
{
bfs(s);
if(level[t]<) return flow;
memset(iter,,sizeof(iter));
int f;
while((f=dfs(s,t,inf))>)
{
flow+=f;
}
}
}
int minedge()
{
for(int k=;k<=n;k++)
fro[k]=inf;
fro[]=;
queue<int> Q;
Q.push();
while(!Q.empty())
{
int s=Q.front();
Q.pop();
if(s==n) break;
for(int i=;i<g[s].size();i++)
{
edge e=g[s][i];
if(dis[s]+e.cap==dis[e.to])
{
if(fro[s]+<fro[e.to])
{
fro[e.to]=fro[s]+;
Q.push(e.to);
}
}
}
}
return fro[n];
}
int main()
{
// freopen("1007.in", "r", stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=;i<=n;i++)
g[i].clear();
memset(gg,,sizeof(gg));
for(int i=;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a].push_back((edge){b,c,});
g[b].push_back((edge){a,c,});
gg[a][b]=c;
gg[b][a]=c;
}
for(int i=;i<=maxn;i++)
group[i].clear();
dijkstra();
ans2=minedge();
build();
int ans1 = max_flow(,n);
printf("%d %d\n",ans1,m-ans2);
}
return ;
}

最新文章

  1. pandas基础-Python3
  2. python对缓存(memcached,redis)的操作
  3. 三言两语之js面向对象初探1
  4. P值与significant(显著性)的理解
  5. codeforces 581C. Developing Skills 解题报告
  6. 如何把Eclipse工程导入到Android Studio
  7. PHP 操作MySQL———来自copy
  8. T-SQL游标
  9. 361. Bomb Enemy
  10. 使用canvas来实时播放RTSP视频
  11. Spring 系列之Spring常用注解总结
  12. bug生命周期&amp;bug跟踪处理
  13. dedecms中arclist标签做分页以及分页点击模块样式错乱问题
  14. OpenStack的HA方案
  15. Partition Numbers的计算
  16. CentOS下iptables详解
  17. 机器学习入门-交叉验证选择参数(数据切分)train_test_split(under_x, under_y, test_size, random_state), (交叉验证的数据切分)KFold, recall_score(召回率)
  18. (转)PlayerPrefs游戏存档
  19. 第一篇随笔, 正在做 ESP32 , STM32 , 树莓派 RaspberryPi 的创客工具
  20. [Ubuntu] sogou中文输入法安装

热门文章

  1. linux安装源文件(.tar.gz)
  2. 【虚拟机-磁盘管理】理解及快速测定 Azure 虚拟机的磁盘性能
  3. Python+selenium之疑难点解决之去除readonly的限制
  4. MFC【exe】工程中的文件大致信息(翻译的)
  5. java.lang.ClassCastException: com.ch.hibernate.Student_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
  6. php循环a-z字母表
  7. Hybrid App开发之Html基本标签使用
  8. Python 求两个文本文件以行为单位的交集 并集 差集
  9. c#和Java中的接口
  10. attachEvent和addEventListener 的使用方法和区别