#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define maxn 1010
int n,m,a,b,ind=1,mm[maxn][maxn],len[maxn],d[maxn],cnt,sigma=15,que[maxn];
struct Trie
{
int ch[maxn][31];
int val[maxn];
int sz;
Trie()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int idx(char c)
{
return c-'a';
}
void insert(char *s,int v)
{
int u=0,n=strlen(s);
for(int i=0; i<n; i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
int search(char *s)
{
int u=0,n=strlen(s);
for(int i=0; i<n; i++)
{
int c=idx(s[i]);
if(!ch[u][c])
return 0;
u=ch[u][c];
}
if(val[u])
return val[u];
return 0;
}
}
t;
void bfs(int x)
{
int he=1,ta=1;
d[x]=1;
que[he]=x;
while(he<=ta)
{
int u=que[he];
he++;
// printf("检查%d\n",u);
for(int i=1; i<=cnt; i++)
{
if((mm[u][i])&&(d[i]<d[u]+mm[u][i]))
{
d[i]=d[u]+mm[u][i];
// printf("d[%d]由d[%d]更新为%d\n",i,u,d[i]);
que[++ta]=i;
// printf("%d推进\n");
}
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
int u,v;
cnt=0;
memset(mm,0,sizeof(mm));
memset(len,0,sizeof(len));
char s1[100],s2[100];
for(int i=1; i<=n; i++)
{
scanf("%s%s",s1,s2);
if(!t.search(s1))
t.insert(s1,++cnt);
if(!t.search(s2))
t.insert(s2,++cnt);
u=t.search(s1);
v=t.search(s2);
// printf("u==%d,v==%d\n",u,v);
if(!mm[u][v])
{
mm[u][v]=1;
len[v]++;
}
}//输入完
int st=-1;
for(int i=1; i<=cnt; i++)
{
// printf("%d的茶%d\n",i,len[i]);
if(!len[i])
{
if(st==-1)
st=i;
else
{
printf("NO\n");
continue;
}
}
}
if(st==-1)
{
printf("NO\n");
continue;
}
bfs(st);
int cixu[maxn];
memset(cixu,0,sizeof(cixu));
for(int i=1; i<=cnt; i++)
{
// printf("d[%d]=%d,cixu=%d\n",i,d[i],cixu[d[i]]);
if((!d[i])||(cixu[d[i]]))
{
printf("NO\n");
continue;
}
cixu[d[i]]=1;
}
printf("YES\n");
}
}
搞得这么复杂,还超时了
就输出个YESNO就行了
我顺便把名次也给输出了233
名字真该用map和string,trie不好找
HDU2094
话说我好喜欢实用