codeforces Gym 101572 I 有向图最小环路径
题目链接 http://codeforces.com/gym/101572
题意 一共n个文件 存在依赖关系 根据给出的依赖关系 判断是否存在循环依赖 ,不存在的话输出SHIP IT,存在的话,打印最小的环,若有多个,输出其中任何一个。
解析 这道题其实很简单,最小的环无非就是自己到自己的最短路,直接把存在依赖的两个文件建立有向边(题意可看出),权值设为1,跑一遍Floyd,找出自己到自己最短路最小的那个点,输出它的路径。但是输入有点恶心,感觉在搞事情,处理一下就好了。
AC代码
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <vector>
using namespace std;
const int maxn = ;
const int maxm = 1e4+;
const int inf = 0x3f3f3f3f;
const double epx = 1e-;
typedef long long ll;
int n,m;
int w[maxn][maxn];
int path[maxn][maxn];
string s[maxn];
void init()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
w[i][j]=inf; //有向图自己到自己要初始化为inf
path[i][j]=j;
}
}
}
void Floyd()
{
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(w[i][k]!=inf&&w[k][j]!=inf)
{
int temp=w[i][k]+w[k][j];
if(w[i][j]>temp)
{
w[i][j]=temp;
path[i][j]=path[i][k];
}
}
}
void input()
{
cin>>n;
init();
map<string,int> ma;
for(int i=;i<=n;i++)
{
cin>>s[i];
ma[s[i]]=i; //给每个文件名字编号
}
string name1,name2,imp;
int k;
for(int i=;i<=n;i++)
{
cin>>name1>>k; //文件名,k个import
for(int i=;i<k;i++)
{
cin>>imp; //import
getline(cin,name2); //读取import后面的字符串 直接读入了一行。。。其他操作也可以
string temp;
int j=;
for(int i=;i<name2.length();i++) //开始处理字符串 因为把import后面的空格也读进来了,所以从1开始
{
if(name2[i]==',')
{
temp=name2.substr(j,i-j); //取子串,substr(pos,n)从pos开始,截取n个字符
j=i+;
i++;
int u=ma[name1],v=ma[temp];
w[u][v]=; //建单向边
}
else if(i==name2.length()-) //最后一个单独处理
{
temp=name2.substr(j,i-j+);
int u=ma[name1],v=ma[temp];
w[u][v]=;
}
}
//cout<<imp<<" "<<name2<<endl;
}
}
}
void print()
{
int mind=inf;
int sta,en;
for(int i=;i<=n;i++)
{
if(w[i][i]<mind)
sta=en=i,mind=w[i][i]; //找最小的环
}
if(mind!=inf)
{
cout<<s[sta];
int u=path[sta][en];
while(u!=en)
{
cout<<" "<<s[u];
u=path[u][en];
}
cout<<endl;
}
else
cout<<"SHIP IT"<<endl;
}
int main()
{
input();
Floyd();
print();
}
codeforces Gym 101572 I 有向图最小环路径的更多相关文章
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Codeforces Gym 101623A - 动态规划
题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...
- 【Codeforces Gym 100725K】Key Insertion
Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...
- Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】
2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...
- codeforces gym 100553I
codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...
- CodeForces Gym 100213F Counterfeit Money
CodeForces Gym题目页面传送门 有\(1\)个\(n1\times m1\)的字符矩阵\(a\)和\(1\)个\(n2\times m2\)的字符矩阵\(b\),求\(a,b\)的最大公共 ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- GYM 101572I(有向图上最小环)
逗号空格是假的,全都直接连边就行. 提供一个迪杰n次的图上最小环板子. #include <cstdio> #include <cstring> #include <io ...
随机推荐
- 快学UIautomator之uiautomatorhelp使用
1.先下载uiautomatorhelp插件 2.把uiautomatorhelp.java包放到自己的项目中 3.项目中引入uiautomatorhelp插件 4.在项目中设置一个main方法,引入 ...
- tomcat假死现象 - 二
1 编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响 ...
- (46)zabbix报警媒介:Jabber
Jabber有第三方插件,能让Jabber用户和MSN.YahooMessager.ICQ等IM用户相互通讯.因为Google遵从Jabber协议,并且Google已经将Gtalk的服务器开放给了其它 ...
- Linux基础学习-使用Squid部署代理缓存服务
使用Squid部署代理缓存服务 Squid是Linux系统中最为流行的一款高性能代理服务软件,通常作为Web网站的前置缓存服务,能够代替用户向网站服务器请求页面数据并进行缓存.Squid服务配置简单. ...
- 如何用纯 CSS 绘制一个充满动感的 Vue logo
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/zaqKPx 可交互视频教 ...
- Python发行版(编译器)
一.Python编译器简介 根据实现Python编译器语言一般分为以下几种: 1.1.CPython 标准的Python,解释型编译器. Python:标准的CPython版本,即官方发布版本. IP ...
- (原)剑指offer跳台阶和矩形覆盖
跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析同样为斐波那契数列边形这样的题肯定有公式 设 ...
- DSP中-stack和-heap的作用
-stack 0x00000800-heap 0x00000800 stack - 又称系统栈(system stack),用于: 保存函数调用后的返回地址; ...
- yum安装的java配置
vim /etc/profile JAVA_HOME=/usr/lib/jvm/javaJRE_HOME=$JAVA_HOME/jreCLASS_PATH=.:$JAVA_HOME/lib/dt.ja ...
- DOM、SAX、JDOM、DOM4J以及PULL在XML文件解析中的工作原理以及优缺点对比
1. DOM(Document Object Model)文档对象模型1. DOM是W3C指定的一套规范标准,核心是按树形结构处理数据,DOM解析器读入XML文件并在内存中建立一个结构一模一样的&qu ...