酷暑一夏1

不忘初心,方得始终


Vijos1876 小岛的标号 题解

题目

Xiaodao是一位喜欢参加ACM比赛的孩子.
所谓ACM比赛, 是一种团队比赛.
每一次比赛, 每队需要由恰好三位选手组成.
现在, Xiaodao希望组建一支新的队伍, 在这之前, 他需要知道每一位朋友有多少可能成为自己的好队友.
他计划给每一位朋友做出一个等级标号.
Xiaodao本人的等级标号为0.
如果一位朋友曾经和Xiaodao组队参加过比赛, 那么就标号为1.
如果一位朋友并没有与Xiaodao组队参加过比赛, 但是曾经与一位”与Xiaodao一起参加过比赛的人”组队参加过比赛. 那么就标号为2.
如果一位朋友无法标号为小于等于 k 的整数, 但是曾经与”标号为k的人”一起参加过比赛, 那么便可以标号为k+1.
其余的朋友们, 便无法给出编号, 我们记为”undefined”.
现在, 我们给出了 n 组曾经参赛过的队伍, 每一组中给出了三位选手的名字.
我们希望知道每一位涉及到的选手应该被给予什么样的标号.

题解

把每组队伍中的队员相互之间建一条权为1的边,然后从Xiaodao的id开始SPFA,将各id的最短路和名字对应后输出即可,若不可达则说明不可确定。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<cstdio>
#include<map>
#include<string>
#include<iostream>
#include<queue>
#include<cstring>
const int MAXN=50000*3+5;
const int MAXM=150000000+5;
struct Edge{int u,v,next;};
int head[MAXN],cnt,nodecnt,dis[MAXN];bool vis[MAXN]/*,exist[MAXN][MAXN]*/;Edge edge[MAXM];std::string inp;
std::map<std::string,int>map;
std::queue<int>que;
std::map<std::string,int>::iterator it;
void AddEdge(int u,int v)
{
int &i=++cnt;
edge[i].u=u;edge[i].v=v;edge[i].next=head[u];head[u]=i;
}
void SPFA(int start)
{
memset(dis,0x3f3f3f,sizeof(dis));
que.push(start);dis[start]=0;
while(!que.empty())
{
int u=que.front();que.pop();
vis[u]=0;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].v;
if(dis[v]>dis[u]+1)
{
dis[v]=dis[u]+1;
if(!vis[v])
{
vis[v]=1;
que.push(v);
}
}
}
}
}
int main()
{
int n,name[3],x,y;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=0;j<3;j++)
{
std::cin>>inp;
x=map[inp];
if(x==0) x=map[inp]=++nodecnt;
name[j]=x;
}
for(int j=0;j<3;j++)
for(int k=j+1;k<3;k++)
{
x=name[j];y=name[k];
AddEdge(x,y);AddEdge(y,x);
}
}
SPFA(map["Xiaodao"]);
for(it=map.begin();it!=map.end();it++)
{
std::cout<<it->first<<" ";
if(dis[it->second]==dis[0]) printf("undefined\n"); else printf("%d\n",dis[it->second]);
}
return 0;
}
最近的文章

评论启用通知

本站即日起启用评论系统,欢迎评论。该系统需要使用Github帐号登录及授权。若您看到[Comments Not Initialized],则表明该页面并未启用评论功能。 …

于  通知 继续阅读
更早的文章

Vijos1411 Dejected Birthday-允诺 题解

题目9.19是青子的生日…而在那日晚,基德发出了盗窃”忧郁的生日”的预告函.快斗在两难的抉择下,最终决定:以最快速度将”忧郁的生日”收入囊中,再赶去为青子表演魔术–这是他对青子的允诺.“忧郁的生日”被保存在一个深不可测的大楼里.而从大门到最里面的房间有无数条路径.整个大楼可以被看做一个巨大的无向图, …

于  Vijos 继续阅读