题目传送门
一开始我使用了类似hash的方法(如下),WA第三个测试点
于是就开启了疯狂搜索模式,希望能够在网上找到一点线索
测试点三、四、五分析
测试点三、四、五的第二种分析
网上大多数的文章,都认为第三个测试点是共同结点出现在最后一位
但是我的代码完全可以处理这个问题,却还是WA
冲浪过程中发现了柳神的代码
真的是风格优美规范没有一句废话,我爱爆
#include
#include
#include
#include
#include
using namespace std;
const int N = 100010;
struct node {
int addr;
char id;
int nxt;
};
node po[N + 1];
int mp[N + 1];
int st1, st2, n;
int vis[N + 1] = { 0 };
int main()
{
scanf("%d%d%d", &st1, &st2, &n);
for (int i = 1; i <= n; ++i) {
int a, b;
char c[5];
scanf("%d%s%d", &a, &c, &b);
mp[a] = i; //地址a对应的是哪个编号
po[i].addr = a;
po[i].id = c[0];
po[i].nxt = b;
vis[i] = 0;
}
for (int i = 1; i <= n; ++i)
if (po[i].nxt != -1)
po[i].nxt = mp[po[i].nxt]; //nxt变成编号
int k = mp[st1];
while (k != -1) {
if (vis[k]) break; //防止有内环,但是数据应该不允许有内环
vis[k] = 1;
k = po[k].nxt;
}
k = mp[st2];
while (k != -1) {
if (vis[k]) {
cout << setw(5) << setfill('0') << po[k].addr;
//printf("%05d", po[k].addr);
return 0;
}
vis[k] = 1;
k = po[k].nxt;
}
printf("-1");
return 0;
}
#include
#include
#include
#include
#include
using namespace std;
const int N = 100000;
struct node {
int addr;
char id;
int nxt;
};
node po[N + 1];
int st1, st2, n;
int vis[N + 1];
int main()
{
scanf("%d%d%d",&st1,&st2,&n);
for (int i = 1; i <= n; ++i) {
int a, b;
char c[5];
scanf("%d%s%d",&a,&c,&b);
po[a].addr = a;
po[a].id = c[0];
po[a].nxt = b;
vis[a] = 0;
}
int k=st1;
while (k != -1) {
if (vis[k]) break; //防止有内环,但是数据应该不允许有内环
vis[k] = 1;
k = po[k].nxt;
}
k=st2;
while (k != -1) {
if (vis[k]) {
cout<<setw(5)<<setfill('0')<<po[k].addr;
//printf("%05d", po[k].addr);
return 0;
}
vis[k] = 1;
k = po[k].nxt;
}
printf("-1");
return 0;
}