题面

题解

最短路图模板题。

介绍一下最短路图:

  • 先对原图跑一边单源最短路,求出源点到每个点\(i\)的最短路\(dis[i]\).
  • 接下来构建新图:对于一条边\((x,y,v)\),若\(dis[x]+v=dis[y]\)则在新图中加入这条边.
  • 这样就构成了一个新图,满足\(DAG\)的性质

对于此题:

先建立最短路图,

考虑最短路图上的一条边\((x,y)\),若\(y\)的入度为\(1\),则\(x\)为重要的.

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <queue> using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
return f * x;
} int tot, n, cnt, dis[1000003], m, qi[1000003], head[1000003], in[3000003], nxt[3000003], ver[1000003], edge[1000003], ans[1000003], sum;
priority_queue <pair <int, int> > q;
int vis[1000003], inans[1000003], bj[100003]; inline void add(int u, int v, int w)
{
ver[++cnt] = v, qi[cnt] = u, edge[cnt] = w, nxt[cnt] = head[u], head[u] = cnt;
} inline void solve(int uuu)
{
memset(dis, 0x3f3f3f3f, sizeof(dis));
memset(vis, 0, sizeof(vis));
q.push(make_pair(0, uuu));
dis[uuu] = 0;
while (!q.empty())
{
int u = q.top().second; q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = head[u]; i; i = nxt[i])
{
int v = ver[i], w = edge[i];
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
q.push(make_pair(-dis[v], v));
}
}
}
memset(bj, 0, sizeof(bj));
memset(in, 0, sizeof(in));
for (int i = 1; i <= cnt; i+=1)
{
int u = qi[i], v = ver[i], w = edge[i];
if (dis[u] + w == dis[v])
{
bj[i] = 1;
++in[v];
}
}
for (int i = 1; i <= cnt; i+=1)
{
int u = qi[i], v = ver[i];
if (bj[i] && in[v] == 1 && u != uuu)
{
inans[u] = 1;
}
}
} int main()
{
n = gi(), m = gi();
for (int i = 1; i <= m; i++)
{
int u = gi(), v = gi(), w = gi();
add(u, v, w), add(v, u, w);
}
for (int i = 1; i <= n; i+=1) solve(i);
bool fl = true;
for (int i = 1; i <= n; i+=1)
{
if (inans[i]) {fl = false; printf("%d ", i);}
}
if (fl) puts("No important cities.");
return 0;
}

最新文章

  1. typedef struct 结构体
  2. 学习C# XmlSerializer 序列化反序列化XML
  3. Unity3D Built-in Shader详解一
  4. Android monkey介绍
  5. sql-case列转行
  6. C#学习笔记(4)
  7. 关于box-sizing
  8. c++构造析构顺序
  9. elasticsearch+spark+hbase 整合
  10. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
  11. 前端面试题整理—jQuery篇
  12. INI配置文件的格式
  13. django之两个使用模板的例子
  14. XML文件处理
  15. 转git的使用
  16. 关于er模型中的identifying relationship or non-identifying relationship
  17. IronPython 的几个问题
  18. OVS流表table之间的跳转
  19. 【内核】linux内核启动流程详细分析
  20. JS事件对象,筋斗云导航练习,跟随鼠标练习,放大镜练习,进度条练习

热门文章

  1. gulp常用插件之gulp-if使用
  2. Linux网络课程学习第六天
  3. ECMAScript基本语法——⑤运算符 赋值运算符
  4. ECMAScript基本语法——⑤运算符 算数运算符
  5. js动画函数
  6. 01-SV入门及仿真环境搭建
  7. 记录 shell学习过程(11 ) shell 对输出流的处理
  8. (转)java 虚拟机内存划分
  9. 题解 CF1064A 【Make a triangle!】
  10. SSM+layui实现增删改查