GYM 101572I(有向图上最小环)
逗号空格是假的,全都直接连边就行。
提供一个迪杰n次的图上最小环板子。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
using namespace std;
const int maxn = 505;
const int inf = 0x3f3f3f3f;
typedef pair<int, int> pii;
int n;
string s[maxn];
string t;
int cnt;
map<string, int> id;
vector<int> adj[maxn];
int dis[maxn], pre[maxn], Ans[maxn];
int ans = inf, final;
int vis[maxn];
int dij(int st) {
memset(pre, 0, sizeof pre);
memset(dis, 0x3f, sizeof dis);
priority_queue<pii, vector<pii>, greater<pii> > Q;
for (int i : adj[st]) {
Q.push({1, i});
dis[i] = 1;
pre[i] = st;
}
while (!Q.empty()) {
int d = Q.top().first, u = Q.top().second;
Q.pop();
if (d > dis[u]) continue;
for (int i : adj[u]) {
if (dis[i] > dis[u] + 1) {
dis[i] = dis[u] + 1;
pre[i] = u;
if (i == st) return dis[i];
Q.push({dis[i], i});
}
}
}
return dis[st];
}
void print(int cur) {
if (vis[cur]) return;
vis[cur] = 1;
print(Ans[cur]);
cout << s[cur] << " ";
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
id[s[i]] = i;
}
for (int i = 1; i <= n; i++) {
cin >> t >> cnt;
int u = id[t];
for (int j = 0; j < cnt; j++) {
cin >> t;
getline(cin, t);
t.erase(0, 1);
string tmp = "";
for (int aa = 0; aa < t.length(); aa++) {
if (t[aa] != ',') {
tmp += t[aa];
} else {
int v = id[tmp];
adj[u].push_back(v);
aa++;
tmp = "";
}
}
if (tmp != "") {
int v = id[tmp];
adj[u].push_back(v);
}
}
}
for (int i = 1; i <= n; i++) {
int tmp = dij(i);
if (ans > tmp) {
ans = tmp;
final = i;
memcpy(Ans, pre, sizeof pre);
}
}
if (ans == inf) {
puts("SHIP IT");
} else {
print(final);
}
}
GYM 101572I(有向图上最小环)的更多相关文章
- HIT 2739 - The Chinese Postman Problem - [带权有向图上的中国邮路问题][最小费用最大流]
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2739 Time limit : 1 sec Memory limit : 64 M A Chinese ...
- 【Floyd算法】Gym - 101572I - Import Spaghetti
题意:有向图最小环,输出方案. #include<cstdio> #include<iostream> #include<string> #include<a ...
- 非负权值有向图上的单源最短路径算法之Dijkstra算法
问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...
- Codeforces 183C(有向图上的环长度)
因为公用一个系统所以大家求gcd:衡量各点之间的拓扑位置,如果到达同一点有不同的长度则取gcd. #include <cstdio> #include <cstring> #i ...
- 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链
luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) . 如果有环,则面具种数一定是所有环的大小的最大公约数. ...
- poj1734 Sightseeing trip【最小环】
Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions:8588 Accepted:3224 ...
- 关于Floyd求解最小环的问题
最近学习了floyd的奇妙用处,求解最小环,自己的领悟写在了纸上. 对于一个最小环,显然至少要包含三个点(此处不把两个点的回路称之为环) 从大体上考虑的话,一定有一个点与左右两侧的点是直接连接的(即不 ...
- 解析·NOIP·冷门 CLZ最小环
赐予我力量,去改变我所能改变的;赐予我勇气,去接受我不能改变的;并赐予我智慧,去分辨这两者. -----安东尼达斯 NOIP的图论题中有一部分是跟图上的环有关的.蒟蒻的我在USACO上刷题时发现了一种 ...
- Codeforces Gym 100431A Achromatic Number 欧拉回路
原题链接:http://codeforces.com/gym/100431/attachments/download/2421/20092010-winter-petrozavodsk-camp-an ...
随机推荐
- openfire调试环境
导入工程: File->New->project: 选择“Java project from existing ant buildfile” 再从菜单windows->show vi ...
- C++ string的查找函数和npos特殊值
STL中的string有6个查找函数: 1.find() 2.rfind() 从最后一个字符开始往前找. 3.find_first_of() 4.find_not_first_of() 5.find_ ...
- bzoj 1369: Gem 树形dp
题目大意 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小.N<=10000 题解 我们可以 ...
- Python调试指南
http://blog.sina.com.cn/s/blog_a15aa56901017u0p.html http://www.cnblogs.com/coderzh/archive/2009/12/ ...
- ubuntu下mysql的安装与配置
1.安装,安装的过程中会提示你设置 MySql的"root"密码 sudo apt-get install mysql-server mysql-client 2.把 /etc/ ...
- xml约束(转)
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 常用的约束技术XML DTD :XML Schema. XML Schema 也是一种用于定义和描述 XML 文档 ...
- 02_mysql卸载和安装
如果只是随便地反安装/uninstall之后,在文件系统或者是注册表里面可能会残留一些东西,这些东西如果不及时清除掉,再装可能会出现问题,你新装的会用不了. #Path to installation ...
- 使用API修改控制台输出的颜色(前景色和背景色)
1.api原型 SetConsoleTextAttribute BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, // ...
- Vector源码剖析
参考:http://blog.csdn.net/ns_code/article/details/35793865
- SQL Server(四)——查询练习(45道习题)转
题目:设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher). 四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1 ...