hdu 1074 dfs or bfs
来源:互联网 发布:网络的利与弊例子英语 编辑:程序博客网 时间:2024/05/19 04:50
//bfs
//Accepted 1074 31MS 2700K 1613 B C++
#include<iostream>
#include<queue>
#include<string>
#include<cstdio>
using namespace std;
int n;
struct node{
int time,cost;
int path[17];
};
node dp[1<<15];
struct obj{
int cost;
int deadline;
char name[105];
}job[17];
void bfs()
{
int i,j,tpath[17],tt,u;
int p,N;
// memset(hash,false,sizeof(hash));
memset(dp,-1,sizeof(dp));
queue<int>q;
dp[0].cost = 0;
dp[0].time = 0;
q.push(0);
while(!q.empty())
{
N =q.front();
q.pop();
for(i = 0; i< n; i++)
{
if( (N & (1<<i) ) == 0) //第i件工作未完成
{
p = ( N|(1<<i) );
for(j = 0; dp[N].path[j] != -1&&j < n; j++)//-1表示路径结束
{
tpath[j] = dp[N].path[j];
}
tpath[j++] = i;//加入i点
tpath[j] = -1;
u = job[i].cost + dp[N].time;
tt = u > job[i].deadline ? u - job[i].deadline : 0;
tt += dp[N].cost;
if(dp[p].cost == -1)
{
for(j = 0;tpath[j] != -1&&j < n; j++)
{
dp[p].path[j] = tpath[j];
}
dp[p].path[j] = -1;
dp[p].cost = tt;
dp[p].time = u;
q.push(p);
}
else if(tt < dp[p].cost)
{
for(j = 0;tpath[j] != -1&&j < n; j++)
{
dp[p].path[j] = tpath[j];
}
dp[p].path[j] = -1;
dp[p].cost = tt;
dp[p].time = u;
}
}
}
}
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i = 0; i< n; i++)
{
scanf("%s %d %d",&job[i].name,&job[i].deadline,&job[i].cost);
}
bfs();
printf("%d/n",dp[(1<<n) -1].cost);
for(i = 0; i< n; i++)
printf("%s/n",job[dp[(1<<n) - 1].path[i]].name);
}
}
///////////////////////dfs
//Accepted 1074 281MS 312K 1205 B C++
//用二进制来表示已完成的状态 例如 001 100 101 分别表示
//做了第1件 第3件 1,3件 DP[(1<<n) - 1]表示做完了n件事的最优值 n=3时
//为dp["111"]即 dp[7]
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int dp[1<<15],n;
bool hash[17];
int path[17],tpath[17];
struct node{
int cost;
int deadline;
char name[105];
}job[17];
void dfs(int nowtime,int nowcost,int num,int nowjob)
{
int u,t;
if(num >= n)
{
if(nowcost < dp[(1<<n) -1])
{
for(int i=0;i<n;i++)
path[i] =tpath[i];
dp[(1<<n)-1] = nowcost;
}
return ;
}
if(dp[nowjob] <= nowcost)
return ;
dp[nowjob] = nowcost;
for(int i=0;i<n;i++)
{
if(hash[i])continue;
hash[i] =true;
u = nowtime+job[i].cost;
t = u > job[i].deadline ? u-job[i].deadline: 0;
t += nowcost;
tpath[num] = i;
dfs(u,t,num+1,nowjob+(1<<i));
hash[i]=false;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int i;
scanf("%d",&n);
for(i = 0; i< n; i++)
{
scanf("%s %d %d",&job[i].name,&job[i].deadline,&job[i].cost);
}
memset(dp,0x7f,sizeof(dp));
memset(hash,false,sizeof(hash));
dfs(0,0,0,0);
printf("%d/n",dp[(1<<n) - 1]);
for(i = 0; i< n; i++)
{
printf("%s/n",job[path[i]].name);
}
}
}
- hdu 1074 dfs or bfs
- hdu 1241 bfs or dfs
- hdu 4394 - Digital Square (dfs or bfs)
- HDU 1242 Rescue(DFS or BFS)
- HDU 1242 Rescue (BFS or DFS)
- hdu 6165(dfs or bfs or tarjan+topsort)
- TOJ3100 BFS or DFS
- 二分法+BFS(or DFS)
- hdu2614 Beat BFS or DFS
- HDU 1983 BFS + DFS
- HDU 1044 BFS + DFS
- hdu (4414)(BFS+DFS)
- hdu 1044 bfs dfs
- hdu 1044 DFS + BFS
- hdu 4101 DFS+BFS
- HDU 1983 DFS+BFS
- HDU 1044 BFS+DFS
- HDU 1044(bfs+dfs)
- 百度搜索技术沙龙感悟
- c++ 初学者指南 第八篇(4)
- 浪费掉的一周
- C#一个产生随机不重复数组
- struts2 ActionContext
- hdu 1074 dfs or bfs
- 电脑硬件主板参数知识知多少-[硬件知识]
- 求一个数组的子数组的最大的和
- 亮一下
- LoadRunner架构(一)
- Spring与Struts1的集成
- Asp.net 产生无重复ID 年月日+三位随机数
- 消去window的最大化和最小化按钮
- 工作羊皮卷