题目链接:http://codeforces.com/gym/100917/problem/F

------------------------------------------------------------------------------------------------

给出一个无向正权无自环图 要求对于每个点 经过它的最短"简单环"的长度

其中简单环的定义是 环上每条无向边都经过且仅经过一次

显然这个环至少经过三条边 三个点

我们或许会产生这样一种思路 对于每次询问 我们以该点$s$作为起点

先处理出到其余每点的最短路 然后枚举一条边  两端分别为$u\ v$

用$s$分别到$u\ v$的最短路再加上这条边的长度来更新结果

然而这样连样例都过不了 因为会产生重边

于是我们考虑把最短路径所经过的边都标记一下(多个可选的话随便标记一个)

然后枚举边的时候碰到标记过的边就直接跳过

不过这样还存在一种情况 就是 $u\ v$ 属于最短路径边所构成树上的除根节点外同一子树

这种情况也是会有重边的 所以这里再判断以下去除就好

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = , E = N * N * ;
int firste[N], nexte[E], v[E], w[E], flag[E];
int used[N], dist[N], fa[N];
int n, e = ;
void build(int x, int y, int z)
{
nexte[++e] = firste[x];
firste[x] = e;
v[e] = y;
w[e] = z;
}
int main()
{
scanf("%d", &n);
int x;
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
{
scanf("%d", &x);
if(i >= j)
continue;
if(x != -)
{
build(i, j, x);
build(j, i, x);
}
}
for(int i = ; i <= n; ++i)
{
int u = i;
for(int j = ; j <= n; ++j)
fa[j] = j;
memset(dist, 0x3f, sizeof dist);
dist[u] = ;
for(int t = ; t < n; ++t)
{
used[u] = i;
int mdist = 1e9, tu;
for(int p = firste[u]; p; p = nexte[p])
if(dist[v[p]] > dist[u] + w[p])
dist[v[p]] = dist[u] + w[p];
for(int j = ; j <= n; ++j)
if(used[j] != i && dist[j] < mdist)
{
tu = j;
mdist = dist[j];
}
for(int p = firste[tu]; p; p = nexte[p])
if(dist[tu] == dist[v[p]] + w[p])
{
flag[p] = flag[p ^ ] = i;
if(v[p] != i)
fa[tu] = fa[v[p]];
break;
}
u = tu;
}
int ans = 1e9;
for(int p = ; p < e; p +=)
if(flag[p] != i && fa[v[p]] != fa[v[p ^ ]])
ans = min(ans, dist[v[p]] + dist[v[p ^ ]] + w[p]);
printf("%d\n", ans < 1e9 ? ans : -);
}
return ;
}

最新文章

  1. Air 压力测试
  2. hdu 4223 Dynamic Programming?
  3. 使用RMAN验证备份的有效性
  4. 浅谈 WPF控件
  5. Android_menu_optionMenu
  6. .net faq
  7. 20款jquery下拉导航菜单特效代码分享
  8. Ajax的三种实现及JSON解析
  9. Spring第二天
  10. 安卓Service完全解析(中)
  11. AngularJS 1.3中的一次性数据绑定(one-time bindings)
  12. JavaScript之事件委托(附原生js和jQuery代码)
  13. springboot~configserver里对重要信息进行RSA加密
  14. OC对象,自动释放池,OC与C语言的区别
  15. 使用SQL查看表字段和字段说明
  16. 登录mysql时的一些命令
  17. linux进程内存布局
  18. mui.init()和mui.plusReady()
  19. function module 调用类对象
  20. Alpha 任务状态总览(持续更新)

热门文章

  1. elementUi---&gt;实现上传图片效果(upload+formData)
  2. 分布式 vs 集群 主从 vs 集群
  3. [2019杭电多校第五场][hdu6628]permutation 1
  4. Codeforces 1159D The minimal unique substring(构造)
  5. python 学习第四十七天shelve模块
  6. latex中\large的作用域问题
  7. 微信小程序之全局储存
  8. 2018-9-21-dot-net-core-使用-usb
  9. 朴素贝叶斯算法——实现新闻分类(Sklearn实现)
  10. python常用模块学习1