Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
3s | 8192K | 1154 | 477 | Standard |
Find out how many people separate one person from another.
The number of people will be no more than 20.
A positive integer representing the number of people in the following list. Each line in the list contains the name of a person, followed by the number of people that person knows, followed by the names of those people. Following this list is a positive integer denoting the number of cases. Each case consists of a starting name and a goal name. Names will not contain any blanks or non-alphabetic characters.
5 Bob 3 Tom John Jim Sam 2 Bob John John 2 Tom Bob Tom 1 Sam Jim 0 3 Jim Sam Sam John John Sam
Jim has no connection to Sam. Sam is separated from John by 0 degrees. John is separated from Sam by 1 degrees.
// 相当恶心的名字当点的最短路题,没有提前给出所有的点,要全部读入在处理点的顺序,可以用二维string的vector,我用的是vector里带的结构体,就当是map和vector的练习题了
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <iostream>
#include <memory.h>
using namespace std;
int n,ind;
int a[21][21];
struct info
{
string name;
int num;
vector <string> name_line;
};
void floyd()
{
int i,j,k;
for (k=1 ; k<=n ; k++)
for (i=1 ; i<=n ; i++)
for (j=1 ; j<=n ; j++)
if(a[i][k]>0 && a[k][j]>0 &&(a[i][j]<=0||a[i][j]>a[i][k]+a[k][j]))
a[i][j]=a[i][k]+a[k][j];
}
int main()
{
//freopen ("in.txt","r",stdin);
//freopen ("out.txt","w",stdout);
vector<info> v;//记录整个信息数据
map<string,int> m;// 映射人名和代号
string s_tmp;
ind=1;//代号(按行增加)
scanf("%d",&n);
int i,j;
for(i=0 ; i<n ; i++)//信息读入
{
info line;//记录信息数据中的每行
cin >> line.name >> line.num;
m [line.name] = ind++;
for (j=0 ; j<line.num ; j++)
{
cin>>s_tmp;
line.name_line.push_back(s_tmp);
}
v.push_back(line);
}
memset (a,-1,sizeof(a));
for (i=0 ; i<n ; i++) //信息处理
{
int u=m[v[i].name],t;
a[u][u]=0;
for(j=0 ; j<v[i].num ; j++)
{
t=m[v[i].name_line[j]];
a[u][t]=1;
}
}
/*for (i=1 ; i<=n ; i++)
for (j=1 ; j<=n ; j++)
{
printf("%d%c",a[i][j],j==n?'/n':' ');
}*/
floyd();
int pm;
string u_s,v_s;
scanf("%d",&pm);
for (i=0 ;i<pm ;i++)
{
cin>>u_s>>v_s;
if(a[m[u_s]][m[v_s]]<=0)
cout<<u_s<<" has no connection to "<<v_s<<"./n";
else
cout<<u_s<<" is separated from "<<v_s<<" by "<<a[m[u_s]][m[v_s]]-1<<" degrees./n";
}
return 0;
}