POJ 1062 昂贵的聘礼
2016-07-15 19:25
260 查看
感觉对于题目意思的理解还是很模糊,也不知道是不是他们表述不清楚。
用了discuss上的几组测试数据测了好几次才过~
能过真是意料之外~~哈哈哈
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int map[200][200],dict[200],va[200],sta[200],n,m,hehe[200],sss[200];
bool vis[200];
int Dikstra(int start) {
vis[start] = true;
dict[start] = 0;
int mmin,now = start,k;
for(int j = 1;j <= m;j++) {
mmin = inf;k = -1;
for(int i = 1;i <= m;i++) {
if(!vis[i]) {
if(map[now][i] != 0 && dict[i] > dict[now] + map[now][i] && abs(sta[i]-sta[now]+sss[now]) <= n /*&& (sta[i]-sta[now])*hehe[now] >= 0*/) {
//hehe[i] = sta[i]-sta[now];
sss[i] += sta[i]-sta[now];
//printf("%d\n",sta[i]-sta[now]);
dict[i] = dict[now] + map[now][i];
}
if(mmin > dict[i])
mmin = dict[k = i];
}
}
if(k == -1)
continue;
vis[k] = true;
now = k;
}
}
int minn(int x,int y) {
if(x > y)
return y;
else
return x;
}
int main () {
while(~scanf("%d%d",&n,&m)) {
memset(map,0,sizeof(map));
memset(vis,false,sizeof(vis));
memset(dict,inf,sizeof(dict));
memset(hehe,0,sizeof(hehe));
memset(sss,0,sizeof(sss));
for(int i = 1;i <= m;i++) {
int value,dd,cnt;
scanf("%d%d%d",&value,&dd,&cnt);
va[i] = value;
sta[i] = dd;
for(int j = 1;j <= cnt;j++) {
int kind,price;
scanf("%d%d",&kind,&price);
map[i][kind] = price;
}
}
Dikstra(1);
int ans = inf;
for(int i = 1;i <= m;i++)
ans = minn(ans,dict[i]+va[i]);
printf("%d\n",ans);
}
}
用了discuss上的几组测试数据测了好几次才过~
能过真是意料之外~~哈哈哈
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int map[200][200],dict[200],va[200],sta[200],n,m,hehe[200],sss[200];
bool vis[200];
int Dikstra(int start) {
vis[start] = true;
dict[start] = 0;
int mmin,now = start,k;
for(int j = 1;j <= m;j++) {
mmin = inf;k = -1;
for(int i = 1;i <= m;i++) {
if(!vis[i]) {
if(map[now][i] != 0 && dict[i] > dict[now] + map[now][i] && abs(sta[i]-sta[now]+sss[now]) <= n /*&& (sta[i]-sta[now])*hehe[now] >= 0*/) {
//hehe[i] = sta[i]-sta[now];
sss[i] += sta[i]-sta[now];
//printf("%d\n",sta[i]-sta[now]);
dict[i] = dict[now] + map[now][i];
}
if(mmin > dict[i])
mmin = dict[k = i];
}
}
if(k == -1)
continue;
vis[k] = true;
now = k;
}
}
int minn(int x,int y) {
if(x > y)
return y;
else
return x;
}
int main () {
while(~scanf("%d%d",&n,&m)) {
memset(map,0,sizeof(map));
memset(vis,false,sizeof(vis));
memset(dict,inf,sizeof(dict));
memset(hehe,0,sizeof(hehe));
memset(sss,0,sizeof(sss));
for(int i = 1;i <= m;i++) {
int value,dd,cnt;
scanf("%d%d%d",&value,&dd,&cnt);
va[i] = value;
sta[i] = dd;
for(int j = 1;j <= cnt;j++) {
int kind,price;
scanf("%d%d",&kind,&price);
map[i][kind] = price;
}
}
Dikstra(1);
int ans = inf;
for(int i = 1;i <= m;i++)
ans = minn(ans,dict[i]+va[i]);
printf("%d\n",ans);
}
}
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法