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

2017南宁网络赛J.Minimum Distance in a Star Graph(bfs求最短路)

2017-09-28 09:50 405 查看
题意:

给你一个n维空间,有n!的节点,节点编号为n的全排列,每个节点num与n-1个节点相连(这n-1个节点的编号分别为num的第一位与后面n-1位交换的数,例如1234与2134,3214,4231相连)

思路:

bfs求最短路,由于节点的数比较大,用map离散化节点就好了。最好根据题意模拟一下相连的边。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll,int> pii;
map<ll,int> mp;

ll Qpow(ll x,ll n)
{
ll res = 1;
while(n>0)
{
if(n&1)
res = res*x;
x = x*x;
n>>=1;
}
return res;
}

int main()
{
int n;
cin>>n;
int test = 5;
while(test--)
{
ll st,en;
scanf("%lld%lld",&st,&en);
queue<pii> q;
mp.clear();
q.push(make_pair(st,0));
mp[st]++;
int ans = 0;
while(!q.empty())
{
pii p = q.front();
ll num = p.first;
if(num==en)
{
ans = p.second;
break;
}
q.pop();
ll top = num/Qpow(10,n-1);
ll temp = num;
for(int i = 0;i<n-1;i++)
{
ll bac = temp%10;
temp /= 10;
ll now = num-top*Qpow(10,n-1)-bac*Qpow(10,i);
now += bac*Qpow(10,n-1)+top*Qpow(10,i);
if(!mp[now])
{
mp[now]++;
q.push(make_pair(now,p.second+1));
}
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: