SSLOJ·开心小屋【DFS】

Description–

Kc来到开心小屋。开心小屋是用来提升心情的。在这个小屋中有n个房间,一些房间之间有门连通。从房间i到达房间j,心情值可以加上-10000<=Cij<=10000,当然Cij可能是负的。现在kc失恋了,所以他想要知道他是否可以在这个小屋中无限地增加他的心情值,也就是无限地绕着一个环走?

请帮kc求出最小的环需要经过的房间数,来使他的心情无限增加。


Input–

第一行给出n,m分别表示房间数及门的数量。

接下来m行,每行四个数:i,j,Cij,Cji

Output–

输出文件包括一行,及最小的环需要经过的房间数。

保证不会出现自环及重边。


Sample Input–

4 4
1 2 -10 3
1 3 1 -10
2 4 -10 -1
3 4 0 -3

Sample Output–

4

说明–

1<=n<=300
1<=m<=5000

样例解释:
1—>3—>4–>2–>1为最小的符合题意的环长度为4.


解题思路–

爆搜。。。。(无语子)


代码–

#include <iostream>
#include <cstdio>

using namespace std;

int n, m, u, v, t, e1, e2, aa, ans = 300, ls[305];
bool pd[305];

struct ooo
{
	int x, y, next;
}f[10005]; //双向边 --> 2m

void cfy(int xx, int lev, int s)
{
	if (lev >= ans || s < 0) return ;
	if (xx == aa && lev > 0)
	{
		if (s > 0) ans = min(ans, lev);
		return ;
	}
	for (int i = ls[xx]; i; i = f[i].next)
	  if (!pd[f[i].x])
	  {
	  	  pd[f[i].x] = 1;
	  	  cfy(f[i].x, lev + 1, s + f[i].y);
	  	  pd[f[i].x] = 0;
	  }
}

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; ++i)
	{
		scanf("%d%d%d%d", &u, &v, &e1, &e2);
		f[++t] = (ooo){v, e1, ls[u]}, ls[u] = t;
		f[++t] = (ooo){u, e2, ls[v]}, ls[v] = t;
	}
	for (int i = 1; i <= n; ++i)
	  aa = i, cfy(i, 0, 0); //aa记录初始点
	printf("%d", ans);
	
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值