题意:

  给出一个图的所有边,每次从图中删除一条边,求任意点对的路径总和(求完了就将边给补回去)。(有重边)

思路:

 #include <bits/stdc++.h>
using namespace std;
const int N=, INF=0x7f7f7f7f;
int mapp[N][N];
bool vis[N]; //是否存在队列中
int dest[N];
vector<pair<int,int> > vect;
int n, m;
int num[N]; void spfa(int x)
{
memset(vis,,sizeof(vis));
memset(dest,0x7f,sizeof(dest));
deque<int> que;
que.push_back(x);
vis[x]=;
dest[x]=;
while(!que.empty())
{
int tmp=que.front();
que.pop_front();
vis[tmp]=;
for(int i=; i<=n; i++)
{
if(mapp[tmp][i]> && dest[tmp]+<dest[i] )
{
dest[i]=dest[tmp]+;
if(!vis[i]) //没有在队列中
{
vis[i]=;
//que.push_back(i);
if(!que.empty() && dest[i]<dest[que.front()]) que.push_front(i);
else que.push_back(i);
}
}
}
}
} int cal()
{
int sum=;
for(int i=; i<=n; i++)
{ spfa(i);
for(int j=; j<=n; j++)
{
if(dest[j]==INF) return ;
sum+=dest[j];
}
}
return sum;
} int main()
{
freopen("input.txt", "r", stdin);
int a, b, c;
while(~scanf("%d%d", &n, &m))
{
vect.clear();
memset(mapp,,sizeof(mapp));
memset(num,,sizeof(num));
for(int i=; i<m; i++)
{
scanf("%d%d",&a,&b);
mapp[a][b]++;
mapp[b][a]++;
num[a]++;
num[b]++;
vect.push_back(make_pair(a,b));
} for(int i=; i<vect.size(); i++)
{
a=vect[i].first;
b=vect[i].second;
if(num[a]==||num[b]==)
{
printf("INF\n");
continue;
}
mapp[a][b]--; //先断开
mapp[b][a]--; int ans=cal();
if(ans==) printf("INF\n");
else printf("%d\n",ans); mapp[a][b]++; //再连上
mapp[b][a]++;
} } return ;
}

正确而TLE代码,spfa+暴力

 #include <bits/stdc++.h>
using namespace std;
const int N=, INF=0x7f7f7f7f;
int mapp[N][N];//图矩阵
bool mapp2[N][N][N]; //标记从某点出发所需关键路径
int tem_sum[N];
int num[N]; //每个点的度
int vis[N]; //用于BFS
vector<pair<int,int> > vect; //m条边
int n, m; int bfs(int x)
{
memset(vis,,sizeof(vis));
deque<int> que(,x);
int cnt=, sum=;
vis[x]=;
while(!que.empty())
{
cnt++;
int siz=que.size();
for(int i=; i<siz; i++)
{
int tmp=que.front();
que.pop_front();
for(int j=; j<=n; j++)
{
if(!vis[j]&&mapp[tmp][j])
{
vis[j]=;
sum+=cnt;
mapp2[x][tmp][j]= mapp2[x][j][tmp]=;//主要在这,记录每个点出发所需要的关键路径
que.push_back(j);
}
}
}
}
return sum;
} int cal(int a,int b) //a-b是删除的边
{
int sum=;
for(int i=; i<=n; i++)
{
if(!a || mapp2[i][a][b] )
{
int tmp=bfs(i);
if(!tmp) return ;
if(!a) tem_sum[i]=tmp; //第一次求还得更新tem_sum
sum+=tmp;
}
else sum+=tem_sum[i];
}
return sum;
} int main()
{
//freopen("input.txt", "r", stdin);
int a, b, c;
while(cin>>n>>m)
{
vect.clear();
memset(mapp,,sizeof(mapp));
memset(mapp2,,sizeof(mapp2));
memset(num,,sizeof(num));
memset(tem_sum,,sizeof(tem_sum)); //一旦更新,不再改 for(int i=; i<m; i++)
{
scanf("%d%d",&a,&b);
mapp[a][b]++, mapp[b][a]++;
num[a]++, num[b]++;
vect.push_back(make_pair(a,b));
} int sum=cal(,); //先求sum,看能否每点互通,不通以下都不必计算了。
for(int i=; i<m; i++)
{
a=vect[i].first, b=vect[i].second;
if(num[a]== || num[b]== || m<n || sum== ) //度为1的点,边不够,不连通
{
printf("INF\n");
continue;
}
if(mapp[a][b]==) //仅有那么1条边,才需要更新
{
mapp[a][b]--, mapp[b][a]--; //先断开
int ans=cal(a,b);//只求需要该边的SSSP
if(ans==) printf("INF\n");
else printf("%d\n",ans);
mapp[a][b]++, mapp[b][a]++; //再连上
}
else printf("%d\n",sum); //非关键,直接输出
} }
return ;
}

AC代码(BFS)

HDU 2433 Travel (最短路,BFS,变形)的更多相关文章

  1. hdu 2433 Travel

    http://acm.hdu.edu.cn/showproblem.php?pid=2433 题意: 求删除任意一条边后,任意两点对的最短路之和 以每个点为根节点求一个最短路树, 只需要记录哪些边在最 ...

  2. hdu 2433 Travel(还不会)

    Problem Description       One day, Tom traveled to a country named BGM. BGM is a small country, but ...

  3. hdu 2433 Travel (最短路树)

     One day, Tom traveled to a country named BGM. BGM is a small country, but there are N (N <= 100) ...

  4. HDU 2717 Catch That Cow --- BFS

    HDU 2717 题目大意:在x坐标上,农夫在n,牛在k.农夫每次可以移动到n-1, n+1, n*2的点.求最少到达k的步数. 思路:从起点开始,分别按x-1,x+1,2*x三个方向进行BFS,最先 ...

  5. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. HDU 3094 树上删边 NIM变形

    基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...

  7. hdu 5380 Travel with candy(双端队列)

    pid=5380">题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量. ...

  8. HDU 2433 (最短路+BFS+剪枝)

    http://acm.hdu.edu.cn/showproblem.php?pid=2433 这个问题因为路径都是1,所以可以用bfs遍历 可以看这几篇文章讲解: http://blog.csdn.n ...

  9. HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)

    Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

随机推荐

  1. Unix无缓冲文件操作函数、文件信息查询

    问题描述:         Unix无缓冲文件操作函数.文件信息查询 问题解决:        struct stat 结构体信息: 具体代码: 具体源文件:

  2. 基于Hash算法的高维数据的最近邻检索

    一.摘要 最紧邻检索:一种树基于树结构,一种是基于hash a.随机投影算法,需要产生很多哈希表,才能提高性能. b.基于学习的哈希算法在哈希编码较短时候性能不错,但是增加编码长度并不能显著提高性能. ...

  3. 首次push本地代码到github上出现的问题及解决方案

    刚创建的github版本库,在push代码时出错: $ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] ...

  4. hdu 2196

    树形dp 本文出自   http://blog.csdn.net/shuangde800 题目传送门 题意: 给出一棵树,求离每个节点最远的点的距离 思路: 把无根树转化成有根树分析, 对于上面那棵树 ...

  5. 帝国cms如何调用栏目别名作为分类标题?[!--classname--]标签不能用

    用帝国cms建站安全性和生成速度会比dedecms好些,但ecms有个比较不方便的地方就是后台默认模板栏目那边没有一个seo标题设置的输入框,列表模板用的是[!--pagetitle--]标签,那么分 ...

  6. jQuery1.9.1源码分析--Animation模块

    var fxNow, // 使用一个ID来执行动画setInterval timerId, rfxtypes = /^(?:toggle|show|hide)$/, // eg: +=30.5px / ...

  7. 理解lua 语言中的点、冒号与self

    转载自: http://blog.csdn.net/wangbin_jxust/article/details/12170233 lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号 ...

  8. C# 在vs2010中打开vs2012的项目(转)

    在vs2010中打开vs2012的项目 今天在自己的电脑上装了vs2010然后要打开之前在vs2012上创建的sln文件 被提示-- 无法打开在新版本上创建的sln--解决方案--文件 其实vs201 ...

  9. hdu2012

    http://acm.hdu.edu.cn/showproblem.php?pid=2012 数组大小算错了.....郁闷-_- #include<iostream> #include&l ...

  10. sublime 复制黏贴等快捷键修改

    在 keyboard-binding user 里 增加个人配置来覆盖默认配置 [ { "keys": ["ctrl+z"], "command&qu ...