ACM PKU 图论的题 请高手帮忙
是PKU1130题
http://acm.pku.edu.cn/JudgeOnline/problem?id=1130
这提我的想法是求0到目的点的路径,然后求这条路径上的关键点,求得离目的点最近的关键点,我自己猜测在路径上离目的点最近的那个关键点应该就是所求关键点(不知道对不对 ^^)
然后。。。下面就是偶的代码了,请高手帮忙看看到底是哪里错了,谢谢~
#include <iostream>
using namespace std;
char ch;
int n,key,route[101],fix;
bool adj[101][101],visited[101],flag;
void DFS(int v,int r)
{
int i;
visited[v]=true;
if(v==key){
fix=r;
flag=true;
return;
}
for(i=0;i <n;i++)
if(adj[v][i]==true&&visited[i]==false)
{
route[r]=i;
DFS(i,r+1);
if(flag==true)return;
}
if(i==n)return;
}
void checkDFS(int v){
int i;
visited[v]=true;
if(v==key){
flag=true;
return;
}
for(i=0;i <n;i++)
if(adj[v][i]==true&&visited[i]==false)
{
checkDFS(i);
if(flag==true)return;
}
if(i==n)return;
}
int main()
{
int i,j,r;
while(cin> > n&&n)
{
cin> > key;
getchar();
for(i=0;i <n;i++)
{
visited[i]=false;
for(j=0;j <n;j++)
adj[i][j]=false;
}
while(1)
{
cin.peek();
ch=getchar();
if(!(ch> = '0 '&&ch <= '9 '||ch== ' '))break;
if(ch> = '0 '&&ch <= '9 ')
{
cin.putback(ch);
cin> > i> > j;
adj[i][j]=true;
while(1)
{
if(getchar()== '\n ')break;
}
}
}
flag=false;
r=1;
route[0]=0;
DFS(0,r);
for(i=fix-2;i> 0;i++)//????ET??????????????????????
{
flag=false;
for(j=0;j <n;j++)
visited[j]=false;
visited[route[i]]=true;
checkDFS(0);
if(flag==false)
{
cout < < "Put guards in room " < <route[i] < < ". " < <endl;
break;
}
}
if(i==0)cout < < "Put guards in room 0. " < <endl;
}
return 0;
}
[解决办法]
硬做的,能ac;
#include <stdio.h>
int m,n;
int *iv,*ie,*in,*ic,*id;
void lookup(int idx,int idx_id)
{
int i,j,k;
if (idx==n)
{
for (i=0;i <idx_id ;++i )
{
in[id[i]]++;
if (ic[id[i]]> idx_id-i)
{
ic[id[i]]=idx_id-i;
}
}
}
iv[idx]=1;
id[idx_id]=idx;
for (i=0;i <m ;++i )
{
if (ie[idx*m+i]==1 && iv[i]==0)
{
lookup(i,idx_id+1);
}
}
iv[idx]=0;
}
int main()
{
int i,j,k;
scanf( "%d %d ",&m,&n);
ie=(int *)malloc(m*m*sizeof(int)); //邻接矩阵
iv=(int *)malloc(m*sizeof(int)); //保存顶点在当前简单路径中是否已访问
id=(int *)malloc(m*sizeof(int)); //保存顶点在当前简单路径中的访问顺序
in=(int *)malloc(m*sizeof(int)); //保存从起点到终点包含顶点的简单路径的个数
ic=(int *)malloc(m*sizeof(int)); //保存顶点到终点的最小路径长度
for (i=0;i <m ;++i )
{
iv[i]=0;
in[i]=0;
id[i]=0;
ic[i]=m;
for (j=0;j <m ;++j )
{
ie[i*m+j]=0;
}
}
while(scanf( "%d %d ",&i,&j)==2 && !(i==0 && j==0))
{
ie[i*m+j]=1;
}
lookup(0,0);
j=m;
for (i=0;i <m ;++i )
{
if (in[i]==in[0] && ic[i] <j)
{
k=i;
}
}
printf( "Put guards in room %d.\n ",k);
return 0;
}