HDU 2433 Travel (最短路,BFS,变形)
题意:
给出一个图的所有边,每次从图中删除一条边,求任意点对的路径总和(求完了就将边给补回去)。(有重边)
思路:
#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,变形)的更多相关文章
- hdu 2433 Travel
http://acm.hdu.edu.cn/showproblem.php?pid=2433 题意: 求删除任意一条边后,任意两点对的最短路之和 以每个点为根节点求一个最短路树, 只需要记录哪些边在最 ...
- hdu 2433 Travel(还不会)
Problem Description One day, Tom traveled to a country named BGM. BGM is a small country, but ...
- hdu 2433 Travel (最短路树)
One day, Tom traveled to a country named BGM. BGM is a small country, but there are N (N <= 100) ...
- 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,最先 ...
- hdu 4568 Hunter 最短路+dp
Hunter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 3094 树上删边 NIM变形
基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...
- hdu 5380 Travel with candy(双端队列)
pid=5380">题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量. ...
- HDU 2433 (最短路+BFS+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=2433 这个问题因为路径都是1,所以可以用bfs遍历 可以看这几篇文章讲解: http://blog.csdn.n ...
- 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 ...
随机推荐
- 【BZOJ】【2208】【JSOI2010】连通数
题解: 1.Tarjan缩点以后对每个连通分量进行深搜,看能到哪些连通分量,能到达的所有连通分量的size之和记为sum.则第i个连通分量对答案的贡献为size[i]*sum(到其他连通分量)+siz ...
- 01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的一级缓存
缓存的范围? 1.事务范围 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结 ...
- lunux 启动 tomcat
本人从官网http://tomcat.apache.org/上面下载的6.0.1_31版本,并解压包后改名存放在:/usr/share/tomcat6 本人使用的是root用户登录,下面就说说具体的操 ...
- 同一机器 部署 两个 jboss
当jboss和oracle在同一机器上时,通常oracle占用8080端口,这时只需要去修改\deploy\jbossweb-tomcat50.sar\server.xml中.当在同一台机器上运行两个 ...
- VisionTimer BUG && Start
void Start() { vp_Timer.In(0.0f, delegate() { Debug.Log("Start"); }, 10, 1.0f); } Version ...
- Unity3D脚本中文系列教程(十四)
http://dong2008hong.blog.163.com/blog/static/469688272014032134394/ WWWFrom 类Unity3D脚本中文系列教程(十三)辅助类. ...
- Observer Pattern
Motivation We can not talk about Object Oriented Programming without considering the state of the ob ...
- REST和SOAP Web Service的区别比较
本文转载自他人的博客,ArcGIS Server 推出了 对 SOAP 和 REST两种接口(用接口类型也许并不准确)类型的支持,本文非常清晰的比较了SOAP和Rest的区别联系! ///////// ...
- Url重写和伪静态
这里是URL重写的精华:http://msdn.microsoft.com/zh-cn/library/ms972974.aspx感觉写的非常棒. 其实URL重写操作起来也是挺简单的,只要你在前台写好 ...
- cojs 白树黑 黑树白 题解报告
黑树白 首先如果不是强制在线,这个题用莫队+树状数组就可以在O(n*sqrt(n)*log(n))的时间内搞定 如果没有修改操作,可以直接上主席树就可以辣 我们考虑修改操作,某一个修改操作对于某一个查 ...