题意:

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

思路:

 #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. SQL Server性能常用语句

    查看各表的数据行数 SELECT o.name, i. ROWS FROM sysobjects o, sysindexes i WHERE o.id = i.id AND o.Xtype = ORD ...

  2. 【转】并查集&MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...

  3. 【POJ】【1741】/【BZOJ】【1468】Tree

    点分治 怎么又一道叫Tree的题目……真是醉了. 本题为漆子超论文<分治算法在树的路径问题中的应用>例一 题解 : http://blog.csdn.net/sdj222555/artic ...

  4. 使用JAVA反射初始化数组(转)

    在做JSON解析时,遇到了在不知道数组类型的前期下,需要转化为具体类型数组的问题.可以使用JAVA的反射来做. JSONArray jsonArray = (JSONArray) entry.getV ...

  5. Unity3D研究院之与Android相互传递消息

    原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ...

  6. winform 开发之Control.InvokeRequired

    Control.InvokeRequired 获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中. InvokeRequir ...

  7. MongoDB 性能优化五个简单步骤

    MongoDB 一直是最流行的 NoSQL,而根据 DB-Engines Ranking 最新的排行,时下 MongoDB 已经击败 PostgreSQL 跃居数据库总排行的第四位,仅次于 Oracl ...

  8. Unity3d修改FBX文件的动画名方法

    问题描述:FBX文件导入Unity3d后的动画名字一般都是 “Take 001”并且无法修改!如何修改它呢? 解决方法:解决方法其实很简单,只要你按照Unity3d的FBX文件命名规则,压根就不会存在 ...

  9. ***redis linux 命令使用总结

    redis命令参考: http://redisdoc.com/ 1. [root@iZ25rloipcsZ src]# redis-cli-bash: redis-cli: command not f ...

  10. **使用 Git Hook 实现网站的自动部署

    http://www.tuicool.com/articles/3QRB7jU 自动化能解放人类的双手,而且更重要的是,因为按照规定的流程来走,也减少了很多误操作的产生.不知道大家平时都是怎么样更新自 ...