题目
分析
- dfs可以过 666
- 一个超级厉害的剪枝 心情一到负数就return
- 因为同一个环,总有第二个点可以满足全为正数
代码
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n,m,start,ans=1e9;
4 int a[305][305];
5 bool vis[305];
6 void dfs(int x,int lev,int sum)
7 {
8 if(lev>ans||sum<0) return;
9 if(x==start&&lev>0)
10 {
11 if(sum>0)
12 ans=min(ans,lev);
13 return;
14 }
15 for(int i=1;i<=n;i++)
16 if(a[x][i]<=10000&&!vis[i])
17 {
18 vis[i]=1;
19 dfs(i,lev+1,sum+a[x][i]);
20 vis[i]=0;
21 }
22 return;
23 }
24 int main()
25 {
26 scanf("%d%d",&n,&m);
27 memset(a,0x3f,sizeof(a));
28 for(int i=1,u,v,x,y;i<=m;i++)
29 {
30 scanf("%d%d%d%d",&u,&v,&x,&y);
31 a[u][v]=x;a[v][u]=y;
32 }
33 for(int i=1;i<=n;i++)
34 start=i,dfs(i,0,0);
35 cout<<ans;
36 }