https://odzkskevi.qnssl.com/da9adfb686ef541a14cec9856721130a?v=1507986800
I题
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#define inf 999999999
#include<map>
#define N 550
using namespace std;
struct edge{
int next,to,w;
}e[500000];
int edn; //边数
int head[N];
int dfn[N],sta[N],h[N],st[N],ans[N];//h[]相当于深度
int tot,lenth;
void add(int u,int v,int w){
e[edn].w=w;
e[edn].to=v;
e[edn].next=head[u];
head[u]=edn++;
}
void dfs(int u,int hh){
h[u]=hh;
dfn[u]=1;
tot++;
st[tot]=u;
sta[u]=1;
int i,j;
for(i=head[u];~i;i=e[i].next){
int v=e[i].to;
if(dfn[v]!=-1){
if(sta[v]!=-1){
if(h[u]-h[v]+1<lenth){
lenth=h[u]-h[v]+1;
for(int j=0;j<lenth;j++){
ans[j]=st[j+h[v]];
}
}
}
else if(h[v]!=-1&&h[v]>hh+1){
dfs(v,hh+1);
}
}
else{
dfs(v,hh+1);
}
}
tot--;
sta[u]=-1;
return ;
}
int main(){
int n;
scanf("%d",&n);
edn=0;
memset(head,-1,sizeof(head));
map<string,int>mp;
map<int,string>ms;
int i,j;
char s[50];
for(i=1;i<=n;i++){
scanf("%s",s);
mp[s]=i;
ms[i]=s;
}
for(i=1;i<=n;i++){
int k;
scanf("%s%d",s,&k);
getchar();
while(k--){
char sline[5000];
char c[50];
int len=0;
gets(sline);
int l=strlen(sline);
for(j=7;j<l;j++){
if(sline[j]!=','){
c[len++]=sline[j];
}
else{
c[len]='\0';
len=0;
add(mp[s],mp[c],1);
j++;
}
}
c[len]='\0';
len=0;
add(mp[s],mp[c],1);
}
}
memset(dfn,-1,sizeof(dfn));
memset(sta,-1,sizeof(sta));
tot=0;
lenth=inf;
for(i=1;i<=n;i++){
memset(h,-1,sizeof(h));
dfs(i,1);
}
if(lenth==inf)printf("SHIP IT\n");
else{
for(i=0;i<lenth-1;i++){
cout<<ms[ans[i]]<<" ";//不能用printf输出
}
cout<<ms[ans[i]]<<endl;
}
return 0;
}