您的位置:首页 > 其它

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路 djikstra 算法