题目链接 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();
}

最新文章

  1. Android 手机卫士--绑定sim卡序列号
  2. php_codesninffer phpcs用法学习使用:
  3. ContentProvider详解
  4. LVS 三种工作模式原理、以及优缺点比较(转载)
  5. DataTable.Compute()用法
  6. javaSE第八天
  7. webrtc--AudioProcessing的使用
  8. codeforces 680C C. Bear and Prime 100(数论)
  9. datetime.datetime.today()生成时间转换成unixtime
  10. 主攻ASP.NET MVC4.0之重生:ASP.NET MVC使用JSONP
  11. thinkphp带查询条件的分页
  12. 【开发技术】 B/S、C/S的区别
  13. eclipse发布web
  14. hdu 4993
  15. 洛谷 P2048 [NOI2010]超级钢琴 解题报告
  16. 〖Ruby〗Ruby运算符/优先级
  17. c/c++值传递和引用传递
  18. CCNA2.0笔记_WAN技术-帧中继
  19. android studio 中类似VS的代码折叠功能Region
  20. 使用nose_parameterized使unitTest实现参数化

热门文章

  1. Log4J的配置与使用详解
  2. Promise中的next 另一个用法
  3. 两种常见JS面向象写法
  4. 解读tensorflow之rnn【转】
  5. HDU - 4811 - Ball (思维)
  6. [LUOGU] P1880 [NOI1995]石子合并
  7. Linux 特殊权限位简介
  8. hdu3594 Cactus
  9. Head First HTML5 Programming笔记--chapter2 介绍Javascript和DOM
  10. linux -- 查找(find)命令 一