vijos p1876 bfs+map

题意:

Xiaodao是一位喜欢参加ACM比赛的孩子.
所谓ACM比赛, 是一种团队比赛.
每一次比赛, 每队需要由恰好三位选手组成.
现在, Xiaodao希望组建一支新的队伍, 在这之前, 他需要知道每一位朋友有多少可能成为自己的好队友.

他计划给每一位朋友做出一个等级标号.
Xiaodao本人的等级标号为0.
如果一位朋友曾经和Xiaodao组队参加过比赛, 那么就标号为1.
如果一位朋友并没有与Xiaodao组队参加过比赛, 但是曾经与一位"与Xiaodao一起参加过比赛的人"组队参加过比赛. 那么就标号为2.
如果一位朋友无法标号为小于等于 k 的整数, 但是曾经与"标号为k的人"一起参加过比赛, 那么便可以标号为k+1.
其余的朋友们, 便无法给出编号, 我们记为"undefined".

现在, 我们给出了 n 组曾经参赛过的队伍, 每一组中给出了三位选手的名字.
我们希望知道每一位涉及到的选手应该被给予什么样的标号.

 

链接:点我

 

邻接表和邻接矩阵都没满分

 1 #include<cstdio>

 2 #include<iostream>

 3 #include<algorithm>

 4 #include<cstring>

 5 #include<cmath>

 6 #include<queue>

 7 #include<map>

 8 using namespace std;

 9 #define MOD 1000000007

10 const int INF=0x3f3f3f3f;

11 const double eps=1e-5;

12 typedef long long ll;

13 #define cl(a) memset(a,0,sizeof(a))

14 #define ts printf("*****\n");

15 const int MAXN=10005;

16 int n,m,tt,u,tot;

17 int c[MAXN][MAXN],dist[MAXN],vis[MAXN];

18 string a[MAXN];

19 struct Node

20 {

21     int to,next;

22 }edge[MAXN*6];

23 int head[MAXN];

24 int tol;

25 void init()

26 {

27     tol=0;

28     memset(head,-1,sizeof(head));

29 }

30 void addedge(int a,int b)

31 {

32     edge[tol].to=b;

33     edge[tol].next=head[a];

34     head[a]=tol++;

35     edge[tol].to=a;

36     edge[tol].next=head[b];

37     head[b]=tol++;

38 }

39 void bfs()

40 {

41     queue<int> q;

42     cl(vis);

43     vis[u]=1;

44     dist[u]=0;

45     int now,next;

46     q.push(u);

47     while(!q.empty())

48     {

49         now=q.front();

50         q.pop();

51         for(int i=head[now];i!=-1;i=edge[i].next)

52         {

53             next=edge[i].to;

54             if(!vis[next])

55             {

56                 dist[next]=dist[now]+1;

57                 vis[next]=1;

58                 q.push(next);

59             }

60         }

61     }

62 }

63 map<string,int> mp;

64 string s="Xiaodao";

65 int main()

66 {

67     int i,j,k;

68     /*#ifndef ONLINE_JUDGE

69     freopen("1.in","r",stdin);

70     #endif*/

71     scanf("%d",&n);

72     tot=1;

73     cl(c);

74     string s1,s2,s3;

75     bool flag=0;

76     init();

77     int i1,i2,i3;

78     for(i=0;i<n;i++)

79     {

80         cin>>s1,cin>>s2,cin>>s3;

81         if((s1==s||s2==s||s3==s)&&!flag)   u=tot,flag=1;

82         i1=mp[s1],i2=mp[s2],i3=mp[s3];

83         if(!mp[s1])    a[tot]+=s1,i1=mp[s1]=tot++;

84         if(!mp[s2])    a[tot]+=s2,i2=mp[s2]=tot++;

85         if(!mp[s3])    a[tot]+=s3,i3=mp[s3]=tot++;

86         addedge(i1,i2),addedge(i1,i3),addedge(i2,i3);

87     }

88     bfs();

89     sort(a+1,a+tot+1);

90     for(i=1;i<=tot;i++)

91     {

92         int l=a[i].length();

93         if(l==0)    continue;

94         for(j=0;j<l;j++)printf("%c",a[i][j]);

95         int id=mp[a[i]];

96         if(!vis[id])    printf(" undefined\n");

97         else printf(" %d\n",dist[id]);

98     }

99 }

 

你可能感兴趣的:(map)