hdu 4284 Travel
来源:互联网 发布:linux netcat源码 编辑:程序博客网 时间:2024/05/29 10:41
hdu 4284 Travel
这个题目比赛的时候,是队友敲的,他是用的搜索过了,Orz,如果比赛让我敲的话我肯定会用状态压缩dp的方法来做,而且肯定TLE或者WA,因为这个题目的数据卡的太紧了,case肯定会很多
状态表示:dp[ state ] [ node ]表示在state 节点 在node 处所能够有的最多的钱,注意判断的时候要注意下
一定要很优化才行,不然很容易TLE,我的这个代码用c++交,3000ms+
#include <cstdlib>#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int inf=0x3fffffff;const int maxn=110;const int maxe=100000;int n,mm,m;int dis[maxn][maxn],map[17][17];int dp[1<<17][17];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]+dis[k][j] < dis[i][j]) dis[i][j]=dis[i][k]+dis[k][j];}struct Node{ int id,C,D;}city[16];int cmp(Node a,Node b){ return a.id < b.id;}int main(int argc, char *argv[]){ int T,a,b,c,dd; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&mm); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]= (i==j?0:inf); for(int i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); dis[a][b]=min(dis[a][b],c); dis[b][a]=dis[a][b]; } floyed(); scanf("%d",&dd); for(int i=0;i<dd;i++) scanf("%d%d%d",&city[i].id,&city[i].C,&city[i].D); sort(city,city+dd,cmp); int end=(1<<dd)-1; if(city[0].id!=1){ for(int i=dd;i>=1;i--) city[i]=city[i-1]; city[0].id=1,city[0].C=city[0].D=0; dd++; end=(1<<dd)-2; } bool flag=0; for(int i=0;i<dd;i++) for(int j=0;j<dd;j++){ map[i][j]=dis[city[i].id][city[j].id]; if(map[i][j]>=inf) flag=1; } if(flag){ puts("NO");continue; } int lim=1<<dd; memset(dp,-1,sizeof(dp)); dp[0][0]=mm; if(mm>=city[0].D) dp[1][0]=mm-city[0].D+city[0].C; for(int i=0;i<lim;i++) for(int j=0;j<dd;j++) if(dp[i][j]>0){ for(int r=0;r<dd;r++) if(dp[i][j]>=map[j][r]) { if(j==r||(i&(1<<r))) continue; int rest=dp[i][j]-map[j][r]; dp[i][r]=max(dp[i][j],rest); if(rest>=city[r].D&&!(i&(1<<r))) dp[i|(1<<r)][r]=max(dp[i|(1<<r)][r],rest-city[r].D+city[r].C); } if(dp[end][0]>=0) break; } bool yes=0; for(int i=0;i<dd;i++) if(dp[end][i]>=map[i][0]) yes=1; puts(yes?"YES":"NO"); } return EXIT_SUCCESS;}
- hdu 4284 Travel
- HDU 4284 Travel
- HDU 4284 Travel
- HDU 4284 Travel
- hdu 4284 Travel(floyd + TSP)
- hdu 4284 Travel Floyd+TSP
- hdu -4284 Travel(状态压缩)
- Hdu 4284 Travel(状态压缩)
- 【状压DP】 HDU 4284 Travel
- hdu 4284——Travel
- HDU 4284Travel (状压dp)
- hdu Travel
- hdu-travel
- Travel HDU
- Travel HDU
- Travel HDU
- HDU 4284 Travel[Floyd+状态DP]
- HDU 4284--Travel(状压dp+TSP)
- SharePoint Pages(2)之SharePoint母版页
- [快速记忆]C语言/php的运算符优先级(结合性)
- 高速缓存区(buffer cache)
- Silverlight4、5单元测试
- printk 输出
- hdu 4284 Travel
- SharePoint Pages(3)之网站页面
- 目前支持REST的Java的Web框架
- SharePoint Pages(4)之应用程序页
- DWR单向推送
- SharePoint Pages(5)之应用程序页的安全性
- strtol函数
- java小小知识点
- ZOJ 3201 Tree of Tree 大水树形背包