您的位置:首页 > 其它

hdu4284 Realtime Status 状压dp TSP问题 最短路

2015-01-06 13:28 281 查看
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<set>
#define inf 1000000000
#define pi acos(-1.0)
#define eps 1e-8
#define seed 131
using namespace std;
typedef pair<int,int> pii;
typedef unsigned long long ULL;
typedef long long LL;
const int maxn=100005;
int n,m,money,h;
int dis[105][105];
int num[105][2];
int dp[105][1<<16];
int pn[105];
void floyed();
void tsp();
int main()
{
    int t;
    scanf("%d",&t);
    int a,b,w;
    int e;
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&money);
        memset(dis,0,sizeof(dis));
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
                dis[i][j]=dis[j][i]=inf;
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&w);
            dis[a][b]=dis[b][a]=min(w,dis[a][b]);
        }
        floyed();
        scanf("%d",&h);
        memset(num,-1,sizeof(num));
        memset(pn,-1,sizeof(pn));
        int id,c,d;
        e=0;
        for(int i=0;i<h;i++)
        {
            scanf("%d%d%d",&id,&c,&d);
            num[id][0]=c;num[id][1]=d;
            pn[e++]=id;
        }
        sort(pn,pn+e);
        memset(dp,-1,sizeof(dp));
        for(int i=0;i<e;i++)
        {
            if(money-dis[1][pn[i]]-num[pn[i]][1]>=0)
            {
                dp[i][1<<i]=money-dis[1][pn[i]]-num[pn[i]][1]+num[pn[i]][0];//TSP问题的边界值
            }
        }
        tsp();
        bool flag=false;
        int goal=(1<<h)-1;
        for(int i=0;i<h;i++)
        {
            if(dp[i][goal]>=dis[pn[i]][1])
            {
                flag=true;
                break;
            }
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
void floyed()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(dis[i][k]!=inf&&dis[k][j]!=inf)
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
}
void tsp()
{
    for(int s=0;s<(1<<h);s++)
    {
        for(int i=0;i<h;i++)
        {
            if((1<<i)&s)
            {
                for(int k=0;k<h;k++)
                {
                    if(k==i||!((1<<k)&s))
                        continue;
                    if(dp[k][s^(1<<i)]-dis[pn[k]][pn[i]]>=0)
                    {
                        if(dp[k][s^(1<<i)]-dis[pn[k]][pn[i]]>=num[pn[i]][1])
                            dp[i][s]=max(dp[i][s],dp[k][s^(1<<i)]-dis[pn[k]][pn[i]]+num[pn[i]][0]-num[pn[i]][1]);
                    }
                }
            }
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐