zoukankan      html  css  js  c++  java
  • 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
    ");
    83         else printf("hopeless
    ");
    84     }
    85     return 0;
    86 }
    View Code

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

  • 相关阅读:
    拉普拉斯------拉普拉斯算子
    拉普拉斯------拉普拉斯变换
    傅里叶------傅里叶变换
    傅里叶------傅里叶级数
    深度学习笔记------卷积训练
    深度学习笔记------卷积神经网络
    计算机图形学笔记------直线的扫描转换
    深度学习笔记------神经网络
    深度学习笔记------softmax回归
    深度学习笔记------线性回归
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4427353.html
Copyright © 2011-2022 走看看