SSLOJ 1498 开心小屋 smile
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;
}