PAT (Advanced Level)1032——测试点三非常迷惑

题目传送门

一开始我使用了类似hash的方法(如下),WA第三个测试点
于是就开启了疯狂搜索模式,希望能够在网上找到一点线索

测试点三、四、五分析
测试点三、四、五的第二种分析

网上大多数的文章,都认为第三个测试点是共同结点出现在最后一位
但是我的代码完全可以处理这个问题,却还是WA

冲浪过程中发现了柳神的代码
真的是风格优美规范没有一句废话,我爱爆

A不了C代码

#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;
}

AC代码

#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;
}

你可能感兴趣的:(复健训练,PAT)