HDU 1317 一路wa到西天

来源:互联网 发布:张伯伦生涯数据 编辑:程序博客网 时间:2024/04/29 20:24

简直是对自己无语啊,代码风格出了点问题,自己加了一些不应该加的东西,结果wa到没边了。

这个题目就是需要考虑的就是正环的问题,还有就是是否1和n连通的问题。

连通性考虑floyd算法即可。然后这个判断正环的问题就需要bellman_ford了,写这个的时候发现了其实bellman_ford不必按照模版上教的一定要初始化d为INF,其实是可以初始化为0,然后求最大路的。因为题目要求的是问的是是否有可能达到这个终点,那么如果存在环路的话,可以经过M次多的环之后使得即使后面路再有负数也没多大影响了的。然后这样的话,只需要判断某个点出现的次数是否大于等于n就可以判断是否存在环了。

#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1000;int n;int w,d[maxn],counts[maxn],u,v,num;bool ds[maxn][maxn];struct Edge{    int u,v,val;};vector<Edge>edge;vector<int> g[maxn];void init(){    for(int i=0;i<=n;i++)        g[i].clear();    edge.clear();}void add_edge(int u,int v,int w){    Edge p;    p.u=u;    p.v=v;    p.val=w;    edge.push_back(p);    g[u].push_back(edge.size()-1);}void floyd(){    for(int k=1;k<=n;k++)    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                ds[i][j]|=ds[i][k]&&ds[k][j];            }        }    }}bool bellman_fold(){ queue<int> q; memset(d,0,sizeof(d)); memset(counts,0,sizeof(counts)); d[1]=100; q.push(1); while(!q.empty()) {     int now=q.front();     q.pop();     counts[now]++;     if(counts[now]>=n) return ds[now][n];     for(int i=0;i<g[now].size();i++)     {         Edge e=edge[g[now][i]];         if(d[e.u]+e.val>d[e.v]&&d[e.u]+e.val>0)         {             d[e.v]=d[e.u]+e.val;             q.push(e.v);         }     } }  return d[n]>0;}int main(){    while(scanf("%d",&n)!=EOF)    {        if(n==-1)            break;        memset(ds,0,sizeof(ds));        init();        for(int i=1;i<=n;i++)        {        scanf("%d%d",&w,&num);         for(int j=1;j<=num;j++)            {                scanf("%d",&v);                 add_edge(i,v,w);                 ds[i][v]=1;            }        }        floyd();        if(!ds[1][n])        {           printf("hopeless\n");        }        else        {          if(bellman_fold())          {           printf("winnable\n");          }          else          printf("hopeless\n");        }    }    return 0;}


0 0
原创粉丝点击