Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:建图然后bfs,23333

Posted by zhepeng123 at 2016-11-29 16:45:08 on Problem 1426
In Reply To:建图然后bfs,23333 Posted by:66ccff at 2016-11-13 09:00:43
> 以n的剩余系为点,然后用同余定理建图
> 即以任意x为起点,它的临界点为y=[x(mod n) * 10(mod n)](mod n)
> 和z=(y+1) (mod n)
> 只需要找到一条由1至0的路径,然后输出路径就好了
> 代码如下:
> #include<iostream>
> #include<queue>
> using namespace std;
> 
> void bfs();
> void dfs(int);
> void ins();
> int n;
> int pr[210];
> bool V[210];
> int A[210][2];//利用邻接表存储每个点的临接点
> 
> int main()
> {
> 	while(cin>>n && n!=0)
> 	{
> 		if(n==1)
> 			cout<<n<<endl;
> 		else
> 		{
> 			ins();//建图
> 			bfs();
> 			cout<<endl;
> 		}
> 	}
> 	return 0;
> }
> 
> void ins()
> {
> 	for(int i=1;i<=n-1;i++)
> 	{
> 		int p=( (i%n)*(10%n) ) %n;//同余定理
> 		A[i][0]=p;//乘十
> 		A[i][1]=(p+1)%n;//乘十加一
> 	}
> }
> 
> void bfs()//
> {
> 	queue<int> Q;
> 	int i,j,k;
> 	for(i=0;i<=n;i++)
> 		pr[i]=i;
> 	memset(V,0,sizeof(V));
> 	Q.push(1);
> 	V[1]=true;
> 	while(V[0]==false)
> 	{
> 		int x=Q.front();
> 		Q.pop();
> 		for(i=0;i<=1;i++)
> 		{
> 			int y=A[x][i];
> 			if(!V[y])
> 			{
> 				pr[y]=x;
> 				Q.push(y);
> 				V[y]=1;
> 			}
> 		}
> 		
> 	}
> 	cout<<1;//1为起点
> 	dfs(0);
> }
> 
> void dfs(int x)//递归查找路径
> {
>     if(x!=1)
>     {	
>         dfs(pr[x]);
>         int c=A[pr[x]][0];
> 	if(c==x)
> 		printf("0");//乘十
> 	else
> 		printf("1");//乘十加一
>      }
> 	return ;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator