您的位置:首页 > 理论基础 > 计算机网络

2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J. Minimum Distance in a Star Graph(bfs+状态保存)

2017-09-24 17:03 495 查看
In this problem, we will define a graph called star graph, and the question is to find the minimum distance between two given nodes in the star graph.
Given an integer nn,
an n-dimensionaln−dimensional star
graph, also referred to as S_{n}S​n​​,
is an undirected graph consisting of n!n! nodes
(or vertices) and ((n-1)\
*\ n!)/2((n−1) ∗ n!)/2 edges.
Each node is uniquely assigned a label x_{1}\
x_{2}\ ...\ x_{n}x​1​​ x​2​​ ... x​n​​which
is any permutation of the n digits {1,
2, 3, ..., n}1,2,3,...,n.
For instance, an S_{4}S​4​​ has
the following 24 nodes {1234,
1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321}1234,1243,1324,1342,1423,1432,2134,2143,2314,2341,2413,2431,3124,3142,3214,3241,3412,3421,4123,4132,4213,4231,4312,4321.
For each node with label x_{1}\
x_{2} x_{3}\ x_{4}\ ...\ x_{n}x​1​​ x​2​​x​3​​ x​4​​ ... x​n​​,
it has n-1n−1 edges
connecting to nodes x_{2}\
x_{1}\ x_{3}\ x_{4}\ ...\ x_{n}x​2​​ x​1​​ x​3​​ x​4​​ ... x​n​​, x_{3}\
x_{2}\ x_{1}\ x_{4}\ ...\ x_{n}x​3​​ x​2​​ x​1​​ x​4​​ ... x​n​​, x_{4}\
x_{2}\ x_{3}\ x_{1}\ ...\ x_{n}x​4​​ x​2​​ x​3​​ x​1​​ ... x​n​​,
..., and x_{n}\
x_{2}\ x_{3}\ x_{4}\ ...\ x_{1}x​n​​ x​2​​ x​3​​ x​4​​ ... x​1​​.
That is, the n-1n−1 adjacent
nodes are obtained by swapping the first symbol and the d-thd−th symbol
of x_{1}\
x_{2}\ x_{3}\ x_{4}\ ...\ x_{n}x​1​​ x​2​​ x​3​​ x​4​​ ... x​n​​,
for d
= 2, ..., nd=2,...,n.
For instance, in S_{4}S​4​​,
node 12341234 has 33 edges
connecting to nodes 21342134, 32143214,
and 42314231.
The following figure shows how S_{4}S​4​​ looks
(note that the symbols aa, bb, cc,
and dd are
not nodes; we only use them to show the connectivity between nodes; this is for the clarity of the figure).





In this problem, you are given the following inputs:

nn:
the dimension of the star graph. We assume that nn ranges
from 44 to 99.
Two nodes x_{1}x​1​​ x_{2}x​2​​ x_{3}x​3​​ ... x_{n}x​n​​ and y_{1}y​1​​ y_{2}y​2​​ y_{3}\
...\ y_{n}y​3​​ ... y​n​​ in S_{n}S​n​​.
You have to calculate the distance between these two nodes (which is an integer).


Input Format

nn (dimension
of the star graph)

A list of 55 pairs
of nodes.


Output Format

A list of 55 values,
each representing the distance of a pair of nodes.

样例输入

4
1234 4231
1234 3124
2341 1324
3214 4213
3214 2143


样例输出

1
2
2
1
3


题解:

题意:

给一个全排序,每次允许第一个数字和后面的随便一个数字交换,让你求可以达到目标串的最小交换次数

题解:

一开始从后往前放wa了几发,后来发现9的阶乘是36w左右,满足bfs的时间复杂度,然后就bfs+状态判断ac了

代码:

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<string>
#include<stdio.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<deque>
#include<algorithm>
#define ll long long
#define INF 1008611111
#define M (t[k].l+t[k].r)/2
#define lson k*2
#define rson k*2+1
using namespace std;
struct node
{
ll v;
int step;
};
queue<node>q;
map<ll,int>p;
int a[15];
int b[15];
int main()
{
int test,n,i,j;
ll tar,cur;
node now,next;
scanf("%d",&n);
test=5;
while(test--)
{
scanf("%lld%lld",&tar,&cur);
p.clear();
if(tar==cur)
{
printf("0\n");
continue;
}
while(!q.empty())
q.pop();
now.v=cur;
now.step=0;
p[now.v]=1;
q.push(now);
int t;
while(!q.empty())
{
now=q.front();
q.pop();
for(i=0;i<n;i++)
{
a[n-i-1]=now.v%10;
b[n-i-1]=a[n-i-1];
now.v/=10;
}
for(i=1;i<n;i++)
{
swap(b[0],b[i]);
next.v=0;
for(j=0;j<n;j++)
{
next.v=next.v*10+b[j];
b[j]=a[j];
}
if(!p[next.v])
{
p[next.v]=1;
next.step=now.step+1;
if(next.v==tar)
{
t=next.step;
goto loop;
}
q.push(next);
}
}
}
loop:;
printf("%d\n",t);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐