zoukankan      html  css  js  c++  java
  • pku 1932

    Bellman-ford 的变形:

    题意:一个游戏,要在能量大于0的情况下从room[1]走到room[n]判为赢,不然中途停止或者能量为负判为输,其中房间之间可以是回路,每个房间有自己的能量。

    由于是求能否到达,当然想尽可能的多增加能量,故用Bellman求最长路。而中间过程中不能使能量为零或负,故在Bellman松弛前加一条件,控制其松弛的点。最后如果能得到终点最长路大于零,则能过关,或者有正圈可以到达终点,也能过关。

    判断是否连通,用floyd 算法,O(n^3)

    #include<iostream>
    #include<string>
    #define MAXINT 9999999
    #define MAXN 110
    using namespace std;
    int dis[MAXN],n,m,num,w[MAXN];
    char map[MAXN][MAXN];
    struct edge
    {
    	int u,v;
    }e[MAXN*MAXN];
    void floyd()//判断起点与终点是否连通
    {
    	for(int k=1;k<=n;k++)
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=n;j++)
    				if(map[i][k]&&map[k][j])
    					map[i][j]=1;
    	map[n][n]=1;
    }
    bool bellman_ford()
    {
    	floyd();
    	if(!map[1][n]) return false;
    	for(int i=1;i<=n;i++)
    		dis[i]=-MAXINT;
    	dis[1]=100;
    	for(int i=0;i<n-1;i++)
    	{
    		int flag=0;
    		for(int j=0;j<num;j++)
    		{
    			int t=e[j].v;
    			if(dis[t]<dis[e[j].u]+w[t]&&dis[e[j].u]+w[t]>0)//加强松弛的条件,松弛之后要大于零
    			{
    				dis[t]=dis[e[j].u]+w[t];
    				flag=1;
    			}
    		}
    		if(!flag)//没有可进行的松弛操作
    			break;
    	}
    	if(dis[n]>0)//存在到终点为正的路径
    		return true;
    	for(int j=0;j<num;j++)
    	{
    		int t=e[j].v;
    			if(dis[t]<dis[e[j].u]+w[t]&&dis[e[j].u]+w[t]>0&&map[t][n])//存在正环&&与终点连通,
    				return true;
    	}
    		return false;
    }
    int main()
    {
    	int a,b;
    	while(cin>>n&&n!=-1)
    	{
    		num=0;
    		memset(map,0,sizeof(map));
    		for(int i=1;i<=n;i++)
    		{
    			cin>>w[i]>>a;
    			for(int j=0;j<a;j++)
    			{
    				cin>>b;
    				e[num].u=i;
    				e[num].v=b;
    				num++;
    				map[i][b]=1;
    			}
    		}
    		if(bellman_ford())
    			cout<<"winnable"<<endl;
    			else cout<<"hopeless"<<endl;
    	}
    	return 0;
    }
    		
    

     

  • 相关阅读:
    table操作:边框-斑马线-多表头-焦点高亮-自动求和
    Pygame
    Struts+HIbernate+Spring
    java 中hashcode 与 equals的关系
    Testcase的编写
    Struts+Hibernate+Spring常见问题
    我的思考
    JSP-------<%@ %>
    Python yield
    Python:itertools模块
  • 原文地址:https://www.cnblogs.com/nanke/p/2138710.html
Copyright © 2011-2022 走看看