博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu3339 In Action(Dijkstra+01背包)
阅读量:7206 次
发布时间:2019-06-29

本文共 3817 字,大约阅读时间需要 12 分钟。

/*   题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用    坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit distance costs 1 unit oil!   最后占领的所有的站点的能量值之和为总能量值的一半还要多,问最少耗油多少!    *//*     思路:不同的坦克会占领不同的站点,耗油最少那就是路程最少,所以我们先将从 0点到其他各点的     最短距离求出来!也就是d[i]的值!然后我们又知道每一个站点的所具有的能量值!也就是w[i];     最后求出满足占领站点的能量比总能量的一半多并且路程最少。。。直接01背包走起! */ #include
#include
#include
#include
#include
#include
#define N 10005#define INF 0x3f3f3f3fusing namespace std;int w[105];struct EDGE{ int u, v, nt, dist; EDGE(){} EDGE(int u, int v, int nt, int dist){ this->u=u; this->v=v; this->nt=nt; this->dist=dist; }};EDGE edge[N*2];int first[105];int cnt;queue
>q;int n, m;int dp[10005];int d[105];int map[105][105];void addEdge(int u, int v, int dist){ edge[cnt++]=EDGE(u, v, first[u], dist); first[u]=cnt-1; edge[cnt++]=EDGE(v, u, first[v], dist); first[v]=cnt-1;}void Dijkstra(){ d[0]=0; q.push(make_pair(0, 0)); while(!q.empty()){ pair
cur=q.front(); q.pop(); int u=cur.second; if(d[u] != cur.first) continue; for(int e=first[u]; e!=-1; e=edge[e].nt){ int v=edge[e].v, dist=edge[e].dist; if(d[v] > d[u] + dist){ d[v] = d[u] + dist; q.push(make_pair(d[v], v)); } } }}int main(){ int t; int sumP, sumD; scanf("%d", &t); while(t--){ scanf("%d%d", &n, &m); cnt=0; memset(d, 0x3f, sizeof(d)); memset(first, -1, sizeof(first)); for(int i=0; i<=n; ++i) for(int j=0; j<=n; ++j) map[i][j]=INF; while(m--){ int u, v, dist; scanf("%d%d%d", &u, &v, &dist); if(map[u][v]>dist) map[u][v]=map[v][u]=dist; } for(int i=0; i<=n; ++i) for(int j=0; j<=i; ++j) if(map[i][j]!=INF) addEdge(i, j, map[i][j]); Dijkstra();//求出 0点到其他个点的最短的距离! sumP=sumD=0; for(int i=1; i<=n; ++i){ scanf("%d", &w[i]); sumP+=w[i]; sumD+=d[i]; } memset(dp, 0x3f, sizeof(dp));//初始背包的总价值为无穷大 dp[0]=0; //zeroOnePackage... d[i]相当于价值(也就是耗油量), w[i]相当于容积(也就是能量值) for(int i=1; i<=n; ++i) for(int j=sumP; j>=w[i]; --j) dp[j]=min(dp[j], dp[j-w[i]]+d[i]); int maxCost=INF; for(int i=sumP/2+1; i<=sumP; ++i)//注意是sumP/2+1(因为要比一半多) if(maxCost>dp[i]) maxCost=dp[i]; if(maxCost==INF) printf("impossible\n"); else printf("%d\n", maxCost); } return 0;}/* 思路:dp[i][j]表示到达 i站点, 并且占领的能量值为 j时的耗油最小值! 开始想用的是spfa算法,并且在进行节点之间距离松弛的时候,也将 背包融进来,但是超时啊! 好桑心..... */#include
#include
#include
#include
#include
#include
#define N 10005#define INF 0x3f3f3f3fusing namespace std;int w[105];struct EDGE{ int u, v, nt, dist; EDGE(){} EDGE(int u, int v, int nt, int dist){ this->u=u; this->v=v; this->nt=nt; this->dist=dist; }};EDGE edge[N*2];int first[105];int cnt;queue
>q;int vis[105];int n, m, sum;int dp[105][10005];int map[105][105];void addEdge(int u, int v, int dist){ edge[cnt++]=EDGE(u, v, first[u], dist); first[u]=cnt-1; edge[cnt++]=EDGE(v, u, first[v], dist); first[v]=cnt-1;}void spfa(){ dp[0][0]=0; q.push(make_pair(0, 0)); vis[0]=1; while(!q.empty()){ pair
cur=q.front(); q.pop(); int u=cur.second; vis[u]=0; for(int e=first[u]; e!=-1; e=edge[e].nt){ int v=edge[e].v, dist=edge[e].dist; for(int j=w[v]; j<=sum; ++j) if(dp[v][j] > dp[u][j-w[v]] + dist){ dp[v][j] = dp[u][j-w[v]] + dist; if(!vis[v]){ vis[v]=1; q.push(make_pair(dp[v][j], v)); } } } }}int main(){ int t; scanf("%d", &t); while(t--){ scanf("%d%d", &n, &m); cnt=0; memset(first, -1, sizeof(first)); for(int i=0; i<=n; ++i) for(int j=0; j<=n; ++j) map[i][j]=INF; while(m--){ int u, v, dist; scanf("%d%d%d", &u, &v, &dist); if(map[u][v]>dist) map[u][v]=map[v][u]=dist; } for(int i=0; i<=n; ++i) for(int j=0; j<=n; ++j) if(map[i][j]!=INF) addEdge(i, j, map[i][j]); for(int i=1; i<=n; ++i){//最后将1...n节点的最优值汇聚到 第 n+1个节点上 edge[cnt++]=EDGE(i, n+1, first[i], 0); first[i]=cnt-1; } sum=0; for(int i=1; i<=n; ++i){ scanf("%d", &w[i]); sum+=w[i]; } w[n+1]=0; for(int i=0; i
dp[n+1][i]) maxCost=dp[n+1][i]; if(maxCost==INF) printf("impossible\n"); else printf("%d\n", maxCost); } return 0;}

转载地址:http://zjvum.baihongyu.com/

你可能感兴趣的文章
计算形状Shape(圆Circle,矩形Square ,正方形Rectangle)的面积、周长
查看>>
WP7基础学习---第七讲
查看>>
[摘录]第一部分 掌舵领航(4)
查看>>
50、转自知乎上android开发相见恨晚的接口
查看>>
递归 && 反射
查看>>
android AlertDialog 错误 OnClickListener 报错
查看>>
mysql 随机数字 & 置顶排序
查看>>
javaweb配置连接mysql数据库
查看>>
Android — — —动态添加碎片
查看>>
欧拉函数
查看>>
如何使用系统软件截图
查看>>
【转】 Oracle 中的一些重要V$ 动态性能视图,系统视图和表
查看>>
模板模式 c#
查看>>
由于js词法性质和全局变量被更改,循环绑定的click事件执行时变量和定义时 不一致的bug,各种解决方案。...
查看>>
图片处理--边缘高亮
查看>>
解析Disruptor:解密内存障
查看>>
管道-过滤器模式学习总结
查看>>
投放数据获取(三):搜狗
查看>>
springboot之使用redistemplate优雅地操作redis
查看>>
《斯坦福大学:编程范式》第5节1:void*类型的使用:一个兼容所有类型的线性搜索...
查看>>