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 ...
 
随机推荐
- 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)
			
第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...
 - jsp参数传递
			
jsp参数传递 jsp中四种传递参数的方法 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf=&q ...
 - 搭建LoadRunner中的场景(四)控制器的全局设置
			
选择“Tools”菜单-“Options”选项打开设置窗口 1.超时设置 2.运行时设置 3.运行时文件存储设置 4.路径翻译表 路径翻译表是一种映射,将控制器上的文件路径转换为远程主机上的文件路径. ...
 - 集训Day4
			
在bzoj刷了好几天杂题感觉手感不是很好 继续回来集训一下 好几天没更新了啊... bzoj1875 一个无向图,一个人要从起始点走$t$步走到终点,不能沿着刚走过来那条边回去,问有多少种走法 $m ...
 - IE botton 点击文字下沉
			
IE点击文字下沉这个应该是浏览器自带的,只要是用button标签应该都是避免不了的. 如果实在接受不了的话,用一个元素比如div.p等块级元素或者是i.b.s.u.span等行内元素.用样式去模拟bu ...
 - VirtualBox下安装MacOS11
			
8.键盘选中 “简体中文” -- > "拼音模式".VirtualBox安装Mac OS 10.11 ,安装日期:2016 / 5 / 14 用虚拟机装黑苹果本人也装了不下3 ...
 - bzoj 3796 Mushroom追妹纸 —— 后缀数组
			
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3796 先把三个串拼在一起,KMP 求 s1 , s2 中每个位置和 s3 的匹配情况: 注意 ...
 - MFC  ListBox 设置水平长度
			
在*.rc资源 设置可以水平滚动, 垂直滚动 但是 水平滚动无效,水平方向 一直无法显示 完整 设置代码如下 m_listBox.SetHorizontalExtent(2000); m_listBo ...
 - C#窗体上绘制矩形
			
先上效果图 鼠标三个事件 private void Form1_MouseDown(object sender, MouseEventArgs e) { //记录开始点 this.mousedown ...
 - 04_数据库升级onUpgrade&ondowngrade
			
如果想操作多个数据库就不要把数据库的名字写死了 public MyOpenHelper(Context context, String name){ //第一个参数上下文 //第二个参数 数据库的名字 ...