首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

ACM PKU 图论的题 请高手帮忙,该怎么解决

2012-02-23 
ACM PKU 图论的题请高手帮忙是PKU1130题http://acm.pku.edu.cn/JudgeOnline/problem?id1130这提我的想法

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;
}

热点排行