码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1317 XYZZY【Bellman_Ford判断正环】

时间:2015-04-15 00:52:08      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出n个房间,初始在房间1有100的能量值,每次进入一个房间,能量值可能增加也可能减小,(是点权,不是边权),问能否到达终点的时候能量值还为正

这题自己写的时候wa--wa--

后来看了题解,还是wa---wa---

题解很详细http://blog.csdn.net/freezhanacmore/article/details/9937327

记录下自己犯的错误吧

首先是floyd函数初始化的时候,直接写在了函数里面,这样是不对的,因为输入值在前,调用函数在后,这样就相当于将之前输入的可能部分改变了(这个改了好久啊-----55555)

还有就是Bellman_ford时,因为是求正环,所以是d[i][j]=-INF(i!=j)

还有就是输入的权值是点权

技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 typedef long long LL;
14 const int INF = 10000000000;
15 const int mod=1000000007;
16 const int maxn=110;
17 int en[maxn],d[maxn],w[maxn][maxn];
18 int n,m,ecnt;
19 
20 
21 struct Edge{
22     int u,v;
23 } e[maxn*maxn];
24 
25 void add(int u,int v){
26     e[++ecnt].u=u;
27     e[ecnt].v=v;
28 }
29 
30 void floyd(){    
31     for(int k=1;k<=n;k++)
32      for(int i=1;i<=n;i++)
33       for(int j=1;j<=n;j++)
34       w[i][j]=w[i][j]||(w[i][k]&&w[k][j]);
35 }
36 
37 
38 int Bellman_ford(){
39     for(int i=1;i<=n;i++) d[i]=-INF;
40     d[1]=100;
41     
42     for(int i=1;i<n;i++){
43         for(int j=1;j<=ecnt;j++){
44             int v=e[j].v;
45             int u=e[j].u;
46             if(d[v]<d[u]+en[v]&&d[u]+en[v]>0){
47                 d[v]=d[u]+en[v];
48             }
49         }
50     }
51     
52     for(int j=1;j<=ecnt;j++){
53             int v=e[j].v;
54             int u=e[j].u;
55             if((d[v]<d[u]+en[v])&&d[u]+en[v]>0) {
56                 if(w[v][n])
57                 return 1;
58             }        
59     }
60     return d[n]>0;
61 }
62 
63 int main(){
64     int num;
65     while(scanf("%d",&n)!=EOF&&n!=-1){
66         ecnt=0;
67     
68         memset(en,0,sizeof(en));
69         memset(w,0,sizeof(w));
70         for(int i=1;i<=n;i++) w[i][i]=1;
71         for(int i=1;i<=n;i++){
72             scanf("%d %d",&en[i],&num);
73             while(num--){
74                 int u;
75                 scanf("%d",&u);
76                 w[i][u]=1;
77                 add(i,u);
78             }
79         }    
80         
81         floyd();
82         if(Bellman_ford()) printf("winnable\n");
83         else printf("hopeless\n");
84     }
85     return 0;
86 }
View Code

 

 

 

 

 

 

 

 

加油啊- go---go--go

 

HDU 1317 XYZZY【Bellman_Ford判断正环】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4427353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!