HDU 1317 XYZZY【Bellman_Ford判断正环】

题意:给出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

 

你可能感兴趣的:(for)