摧毁巴士站(bus)

Input
第一行包含三个整数n,m,k (2

接下来m行,每行2个整数s和f,表示从站s到站f有一条路。

Output
输出最少需要摧毁的巴士站数目。

Sample Input
5 7 3

1 3

3 4

4 5

1 2

2 5

1 4

4 5

Sample Output
2

Data Constraint
30%的数据N<=15。

.
.
.
.
.
.
分析
一条长度不超过k kk的最短路径上的点,至少有一个是要被删掉的(至于删除哪个好,可以枚举尝试),删掉一个点后再重新求最短路,重复操作即可。

.
.
.
.
.
.
程序:

#include
#include
#include
#include
using namespace std;

int n,m,k,ans=1e9,a[55][55],dis[55],f[55],g[55][55];
bool vis[55],flag[55];
queue q;

void spfa()
{
	memset(dis,0X3f,sizeof(dis));
	dis[1]=0;
	q.push(1);
	while (!q.empty())
	{
		int x=q.front();
		q.pop();
		vis[x]=0;
		for (int i=1;i<=n;i++)
			if (!flag[i]&&a[x][i]&&a[x][i]+dis[x]=ans) return;
	memset(f,0,sizeof(f));
	spfa();
	if (dis[n]>k)
	{
		ans=min(ans,x);
		return;
	}
	g[x][0]=0;
	work(n,x);
	for (int i=1;i

你可能感兴趣的:(图论,c++,jzoj比赛)