/*
纯BFS,注意两个点之间可以有多条边,所以每个点相连的点的总数可能很大,一开始把
circle 里的conn开小了,WA,开大点就OK了
*/
#include <iostream>
#include <queue>
#define MAX_N 100
using namespace std;
struct circle
{
int color;
int countv;
int conn[MAX_N * MAX_N+ 1][2]; //id and color
}circles[MAX_N + 1];
int N, L, K, Q;
bool v[MAX_N + 1][MAX_N + 1];
struct pos
{
int posl, posk, steps;
};
queue<pos> bfsq;
int steps;
bool bfs()
{
pos temp = {L, K, 0};
v[L][K] = true;
while(!bfsq.empty()) bfsq.pop();
bfsq.push(temp);
bool found = false;
while(!bfsq.empty())
{
temp = bfsq.front();
bfsq.pop();
int sPos1 = temp.posl, color1 = circles[sPos1].color, num1 = circles[sPos1].countv;
int sPos2 = temp.posk, color2 = circles[sPos2].color, num2 = circles[sPos2].countv;
if(sPos1 == Q || sPos2 == Q)
{
found = true;
if(temp.steps < steps) steps = temp.steps;
}
int p, newPos, curSteps = temp.steps, conColor;
for(p = 1; p <= num1; p++)
{
newPos = circles[sPos1].conn[p][0];
conColor = circles[sPos1].conn[p][1];
if(!v[newPos][sPos2] && newPos != sPos2 && conColor == color2)
{
v[newPos][sPos2] = true;
pos newpos = {newPos, sPos2, curSteps + 1};
bfsq.push(newpos);
}
}
for(p = 1; p <= num2; p++)
{
newPos = circles[sPos2].conn[p][0];
conColor = circles[sPos2].conn[p][1];
if(!v[sPos1][newPos] && newPos != sPos1 && conColor == color1)
{
v[sPos1][newPos] = true;
pos newpos = {sPos1, newPos, curSteps + 1};
bfsq.push(newpos);
}
}
}
return found;
}
int main()
{
int i, en, from, to, color;
scanf("%d%d%d%d", &N, &L, &K, &Q);
steps = INT_MAX;
memset(circles, 0, sizeof(circles));
for(i = 1; i <= N; i++)
scanf("%d", &circles[i].color);
scanf("%d", &en);
for(i = 1; i <= en; i++)
{
scanf("%d%d%d", &from, &to, &color);
circles[from].countv++;
circles[from].conn[circles[from].countv][0] = to;
circles[from].conn[circles[from].countv][1] = color;
}
if(bfs()) printf("YES/n%d/n", steps);
else printf("NO/n");
return 0;
}
POJ 1708 Game
最新推荐文章于 2021-07-13 14:19:04 发布