POJ3921
搜索
每次找出最短路 如果小于等于k 那么必定这里有一点是要被删掉的
枚举这个最短路径上的每一个点 (一般不会超过20) 将其相邻边删除
用dijskra求最短路径并且保存即可
深度搜索
#include<cstdio>
#include<cstring>
#define maxn 1000000
bool kill[51],p[51][51],pd[51];
int dist[51],ans,n,m,k;
void dfs(int pans)
{
if(pans>=ans) return;
int i,j,pre[50],minj,minn;
for(i=1;i<=n;i++)
if(p[1][i]&&!kill[i]) {dist[i]=1;pre[i]=1;}
else dist[i]=maxn;
memset(pd,0,sizeof(pd));
dist[1]=0;
pd[1]=1;
for(i=2;i<=n;i++){
minn=maxn;
for(j=1;j<=n;j++)
if(dist[j]<minn&&!pd[j]){
minn=dist[j];
minj=j;
}
if(minn==maxn) break;
pd[minj]=1;
for(j=1;j<=n;j++)
if(dist[j]>dist[minj]+1&&!pd[j]&&p[minj][j]&&!kill[j]){
dist[j]=dist[minj]+1;
pre[j]=minj;
}
}
if(dist[n]<=k){
j=pre[n];
while(j!=1){
kill[j]=1;
dfs(pans+1);
kill[j]=0;
j=pre[j];
}
}
else if(ans>pans) ans=pans;
}
int main()
{
int i,j,x,y;
while(1){
ans=maxn;
scanf("%d%d%d",&n,&m,&k);
if(n==0) break;
memset(p,0,sizeof(p));
memset(kill,0,sizeof(0));
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
p[x][y]=1;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
POJ3921的更多相关文章
随机推荐
- Shell根据年月日创建文件夹
#!/bin/sh dir_path="/vol/project/log/test/" ..} do #echo "$year" cd $dir_path mk ...
- Linked List Sorting (链表)
Linked List Sorting (链表) A linked list consists of a series of structures, which are not necessari ...
- 自动化运维——一键安装MySQL
根据项目需要,前段时间在搞EMM系统各种安装包的自动化部署工作,主要包括一键安装和一键启动\停止功能.总结记录下来,以供后用. 本文主要是自动安装MySQL5.7.11版,Linux版脚本在CentO ...
- oracle的function和procedure返回值给shell
本文演示两个关于如何在shell中调用oracle的function和procedure,并将返回值返回给shell. 1.首在package中创建function和procedure,脚本如下: G ...
- 2016 系统设计第一期 (档案一)MVC 和 Bootstrap 表单转换
bootstrap <form role="form"> <div class="form-group"> <label for= ...
- iOS 通览(一) - 技巧、特性及规范
一.编译器特性 1.ARC. ARC是编译器特性.项目中使用了ARC,编译器会在项目编译的时候自动添加OC对象计数器release代码.并且使用了ARC,项目中将不允许出现release.retain ...
- Mac OS X 软件推荐
1. 前言 每个操作系统都有自己的一套软件系统,但是不同的用户却会有不同的需求,系统虽会为用户提供一些基础软件,不过为了能无碍的进入自己的学习和工作状态,总有一些软件是必须安装的,同时这些软件也可以 ...
- Java中的break与continue区别
break跳出当前循环执行循环下面的程序, 如果break出现在嵌套循环的内层循环, 则break语句只会跳出当前层的循环; 当程序执行到continue时时, 则跳过本次循环程序重新回到循环开始继续 ...
- Linux:crontab命令学习
一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cro ...
- git - 必备指令
1. 查看远程分支 加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话): $ git branch -a master remote tungway v1. * zron ...