2017 ACM-ICPC 亚洲区(南宁赛区)网络赛(J.Minimum Distance in a Star Graph)

来源:互联网 发布:sqlmap dbms mssql 编辑:程序博客网 时间:2024/05/29 06:58

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-dimensionalndimensional star graph, also referred to as S_{n}Sn, is an undirected graph consisting of n!n!nodes (or vertices) and ((n-1)\ *\ n!)/2((n1)  n!)/2 edges. Each node is uniquely assigned a label x_{1}\ x_{2}\ ...\ x_{n}x1 x2 ... xn which is any permutation of the n digits {1, 2, 3, ..., n}1,2,3,...,n. For instance, an S_{4}S4 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}x1 x2x3 x4 ... xn, it has n-1n1 edges connecting to nodes x_{2}\ x_{1}\ x_{3}\ x_{4}\ ...\ x_{n}x2 x1 x3 x4 ... xnx_{3}\ x_{2}\ x_{1}\ x_{4}\ ...\ x_{n}x3 x2 x1 x4 ... xnx_{4}\ x_{2}\ x_{3}\ x_{1}\ ...\ x_{n}x4 x2 x3 x1 ... xn, ..., and x_{n}\ x_{2}\ x_{3}\ x_{4}\ ...\ x_{1}xn x2 x3 x4 ... x1. That is, the n-1n1 adjacent nodes are obtained by swapping the first symbol and the d-thdth symbol of x_{1}\ x_{2}\ x_{3}\ x_{4}\ ...\ x_{n}x1 x2 x3 x4 ... xn, for d = 2, ..., nd=2,...,n. For instance, in S_{4}S4, node 12341234 has 33 edges connecting to nodes 2134213432143214, and 42314231. The following figure shows how S_{4}S4looks (note that the symbols aabbcc, 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}x1 x_{2}x2 x_{3}x3 ... x_{n}xn and y_{1}y1 y_{2}y2 y_{3}\ ...\ y_{n}y3 ... yn in S_{n}Sn.

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.

样例输入

41234 42311234 31242341 13243214 42133214 2143

样例输出

1221

3

题目大意:题目蛮长的,其实没什么内容,只看图和输入输出,这是与八数码类似的路径题,路径是每次可以有n-1种交换,第一个数与后面某位交换,照着之前那篇八数码的改了一下,就过了。。。

#include<iostream>#include<cstring>#include<cstdio>using namespace std;typedef int State[9];const int maxstate=1000000;State st[maxstate],goal;int dist[maxstate];int vis[362880],fact[9];int n;void init_lookup_table(){    fact[0]=1;    for(int i=1;i<=9;i++)        fact[i]=fact[i-1]*i;}int try_to_insert(int s){    int code =0;    for(int i=0;i<n;i++){        int cnt=0;        for(int j=i+1;j<n;j++) if(st[s][j]<st[s][i]) cnt++;        code +=fact[n-1-i]*cnt;    }    if(vis[code]) return 0;    return vis[code] =1;}int bfs(){    int front=1,rear=2;    while(front<rear){        State& s=st[front];        if(memcmp(goal,s,sizeof(s))==0) return front;        for(int d=1;d<n;d++)//第零位与后面的每一位一次交换        {            State& t=st[rear];            memcpy (&t,&s,sizeof(s));            t[d]=s[0];            t[0]=s[d];            dist[rear]=dist[front]+1;            if(try_to_insert(rear)) rear++;//判重与记录        }        front++;    }    return 0;}int main(){    init_lookup_table();    while(~scanf("%d",&n)){        char str[9];        for(int l=0;l<5;l++){            memset(st,0,sizeof(st));            memset(vis,0,sizeof(vis));            memset(dist,0,sizeof(dist));            scanf("%s",str);            for(int i=0;i<n;i++)                st[1][i]=int(str[i]-'1');            scanf("%s",str);            for(int i=0;i<n;i++)                goal[i]=int(str[i]-'1');            int ans=bfs();            printf("%d\n",dist[ans]);        }    }    return 0;}



阅读全文
0 0
原创粉丝点击