Travel

Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3391    Accepted Submission(s): 1162

Problem Description
      One day, Tom traveled to a country named BGM. BGM is a small country, but there are N (N <= 100) towns in it. Each town products one kind of food, the food will be transported to all the towns. In addition, the trucks will always take the shortest way. There are M (M <= 3000) two-way roads connecting the towns, and the length of the road is 1.
      Let SUM be the total distance of the shortest paths between all pairs of the towns. Please write a program to calculate the new SUM after one of the M roads is destroyed.
Input
      The input contains several test cases.
      The first line contains two positive integers N, M. The following M lines each contains two integers u, v, meaning there is a two-way road between town u and v. The roads are numbered from 1 to M according to the order of the input.
      The input will be terminated by EOF.
Output
      Output M lines, the i-th line is the new SUM after the i-th road is destroyed. If the towns are not connected after the i-th road is destroyed, please output “INF” in the i-th line.
Sample Input
5 4
5 1
1 3
3 2
5 4
2 2
1 2
1 2
Sample Output
INF INF INF INF 2 2
题目大意:我们定义一张图的最短路为任意两点的最短路之和。 给定一个无权无向图,求每条边被删除时的图的最短路。
分析:做法挺巧妙的.
          任意两点最短路之和要怎么求?floyd?显然不必要,每条边边权都是1,从每个点开始做一次bfs复杂度是O(n^2),如果暴力枚举每一条边删掉然后做bfs,那么复杂度是O(n^2*m),有超时的危险.
   一个优化:对每个点建一棵从该点出发的最短路树,如果删除的边不在第i个点的最短路树上,删了没影响,直接统计这个最短路树的边权和就可以了,否则就重新计算一遍最短路树.
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ,inf = 0x7ffffff; int n,m,head[],to[maxn * ],nextt[maxn * ],tot = ,pre[][],num[][];
int d[],vis[],sum[];
bool flag = true; struct node
{
int x,y;
} e[maxn]; void add(int x,int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void bfs(int s)
{
queue <int> q;
q.push(s);
for (int i = ; i <= n; i++)
d[i] = inf;
memset(vis,,sizeof(vis));
vis[s] = ;
d[s] = ;
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (!vis[v])
{
pre[s][v] = u;
d[v] = d[u] + ;
vis[v] = ;
q.push(v);
}
}
}
for (int i = ; i <= n; i++)
{
if(d[i] == inf)
{
flag = false;
return;
}
else
sum[s] += d[i];
}
} int bfs2(int s)
{
queue <int> q;
q.push(s);
for (int i = ; i <= n; i++)
d[i] = inf;
memset(vis,,sizeof(vis));
vis[s] = ;
d[s] = ;
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (!vis[v] && num[u][v])
{
d[v] = d[u] + ;
vis[v] = ;
q.push(v);
}
}
}
int res = ;
for (int i = ; i <= n; i++)
{
if (d[i] == inf)
return -;
else
res += d[i];
}
return res;
} int main()
{
while (scanf("%d%d",&n,&m) != EOF)
{
memset(head,,sizeof(head));
tot = ;
flag = true;
memset(pre,,sizeof(pre));
memset(sum,,sizeof(sum));
memset(num,,sizeof(num));
for (int i = ; i <= m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
num[x][y]++;
num[y][x]++;
e[i].x = x;
e[i].y = y;
add(x,y);
add(y,x);
}
for (int i = ; i <= n; i++)
{
bfs(i);
if(!flag)
break;
}
if (!flag)
{
for (int i = ; i <= m; i++)
puts("INF");
}
else
{
for (int i = ; i <= m; i++)
{
bool flag2 = true;
int ans = ,x = e[i].x,y = e[i].y;
for (int j = ; j <= n; j++)
{
if (pre[j][y] != x && pre[j][x] != y)
{
ans += sum[j];
continue;
}
else
{
num[x][y]--;
num[y][x]--;
int t = bfs2(j);
num[x][y]++;
num[y][x]++;
if (t == -)
{
flag2 = false;
puts("INF");
break;
}
else
ans += t;
}
}
if (flag2)
printf("%d\n",ans);
}
}
} return ;
}

Hdu2433 Travel的更多相关文章

  1. HDU2433—Travel (BFS,最短路)

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. 图论 - Travel

    Travel The country frog lives in has nn towns which are conveniently numbered by 1,2,…,n. Among n(n− ...

  3. HDU2433 BFS最短路

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. 【BZOJ-1576】安全路径Travel Dijkstra + 并查集

    1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1044  Solved: 363[Sub ...

  5. Linux inode && Fast Directory Travel Method(undone)

    目录 . Linux inode简介 . Fast Directory Travel Method 1. Linux inode简介 0x1: 磁盘分割原理 字节 -> 扇区(sector)(每 ...

  6. HDU - Travel

    Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, he is t ...

  7. 2015弱校联盟(1) - I. Travel

    I. Travel Time Limit: 3000ms Memory Limit: 65536KB The country frog lives in has n towns which are c ...

  8. ural 1286. Starship Travel

    1286. Starship Travel Time limit: 1.0 secondMemory limit: 64 MB It is well known that a starship equ ...

  9. Travel Problem[SZU_K28]

    DescriptionAfter SzuHope take part in the 36th ACMICPC Asia Chendu Reginal Contest. Then go to QingC ...

随机推荐

  1. nginx 源码阅读 core

    ngx_config.h 数据对齐 #define ngx_align(d, a)     (((d) + (a - 1)) & ~(a - 1)) ngx_core.h #define ng ...

  2. js-jQuery对象与dom对象相互转换(转载)

    核心提示:jquery选择器得到的jquery对象和标准的 javascript中的document.getElementById()取得的dom对象是两种不同的对象类型,一般情况下,如S(’#id’ ...

  3. 记录一下自己申请并使用VPS的全过程

    在学习REST API的时候,想要阅读一下谷歌爸爸的api design guide,无奈无情被墙,正好在学习云相关的技术,就想到申请一个VPS来用用. 这次我选择的是hostmybytes,原因有两 ...

  4. hibernate.hbm.xml文件配置入门小结(1)

    在Hibernate中,各表的映射文件xxx.hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具. hibernate.hbm.xml文件的基本结构如下 ...

  5. CentOS 6.7下创建桌面快捷方式

    CentOS 6.7下创建桌面快捷方式如下: 1 在桌面右键,选择“创建启动器" 2 在弹出菜单中,填写名称(显示在桌面上的名字),命令(可执行程序的路径) 3 点击弹出菜单左边的图标,选择 ...

  6. Java 学习笔记 ------第四章 认识对象

    本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...

  7. 随机生成四则运算式2-NEW+PSP项目计划(补充没有真分数的情况)

    PS:这是昨天编写的随机生成四则运算式2的代码:http://www.cnblogs.com/wsqJohn/p/5264448.html 做了一些改进. 补:在上一次的运行中并没有加入真分数参与的运 ...

  8. 每日Scrum--No.2

    Yesterday:找地图 Today: 找到最适合我们软件的地图版本 Problem:找不到特别匹配的版本

  9. 栈和队列在python中的实现

    栈和队列是两种基本的数据结构,同为容器类型.两者根本的区别在于: stack:后进先出 queue:先进先出 PS:stack和queue是不能通过查询具体某一个位置的元素而进行操作的.但是他们的排列 ...

  10. C语言 aabbcc、abc、fabc、aabc

    输入一个字符串,匹配字符串中连续出现的字符串.并且连续个数相等 如输入 aabbcc.abc.fabc.aabc.aabbc 分别输出yes还是no #include<stdio.h>#i ...