POJ1062 昂贵的聘礼
2016-04-06 22:17
381 查看
一.题目链接:http://poj.org/problem?id=1062
二.思路:设起点为0,枚举每个区间,把超出区间的置为已访问,然后Dijkstra求出0到1的最短路,取所有区间中最短的一个。
三.代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int MAX_SIZE = 102,
INF = 1<<30,
MOD = 1000000007;
int graph[MAX_SIZE][MAX_SIZE];
int rankGap, stuffNum;
int Rank[MAX_SIZE];
void initVisited(int l, int r, bool visited[])
{
int i;
for(i = 1; i <= stuffNum; i++)
if(Rank[i] < l || Rank[i] > r)
visited[i] = true;
}
int Dijkstra(int l, int r)
{
bool visited[MAX_SIZE];
int dist[MAX_SIZE], i, j, minPath, startPos;
memset(dist, 1, sizeof(dist));
memset(visited, 0, sizeof(visited));
initVisited(l, r, visited);
visited[0] = true;
dist[0] = 0;
for(i = 0; i <= stuffNum; i++)
dist[i] = graph[0][i];
for(i = 0; i < stuffNum; i++){
minPath = INF;
for(j = 0; j <= stuffNum; j++){
if(minPath > dist[j] && !visited[j]){
minPath = dist[j];
startPos = j;
}
}
visited[startPos] = true;
for(j = 0; j <= stuffNum; j++){
if(dist[j] > minPath + graph[startPos][j] && !visited[j])
dist[j] = minPath + graph[startPos][j];
}
}
return dist[1];
}
void printGraph(){
for(int i = 0; i <= stuffNum; i++){
for(int j = 0; j <= stuffNum; j++){
if(graph[i][j] == 16843009)
cout<<"INF ";
else
cout<<graph[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
//freopen("in.txt", "r", stdin);
int i, j, beginPos, weight, pathNum;
memset(graph, 1, sizeof(graph));
cin>>rankGap>>stuffNum;
for(i = 1; i <= stuffNum; i++){
cin>>weight>>Rank[i]>>pathNum;
graph[0][i] = weight;
for(j = 0; j < pathNum; j++){
cin>>beginPos>>weight;
graph[beginPos][i] = weight;
}
}
int res = INF;
for(i = Rank[1] - rankGap; i <= Rank[1]; i++)
res = min(res, Dijkstra(i, i + rankGap));
cout<<res<<endl;
}
二.思路:设起点为0,枚举每个区间,把超出区间的置为已访问,然后Dijkstra求出0到1的最短路,取所有区间中最短的一个。
三.代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int MAX_SIZE = 102,
INF = 1<<30,
MOD = 1000000007;
int graph[MAX_SIZE][MAX_SIZE];
int rankGap, stuffNum;
int Rank[MAX_SIZE];
void initVisited(int l, int r, bool visited[])
{
int i;
for(i = 1; i <= stuffNum; i++)
if(Rank[i] < l || Rank[i] > r)
visited[i] = true;
}
int Dijkstra(int l, int r)
{
bool visited[MAX_SIZE];
int dist[MAX_SIZE], i, j, minPath, startPos;
memset(dist, 1, sizeof(dist));
memset(visited, 0, sizeof(visited));
initVisited(l, r, visited);
visited[0] = true;
dist[0] = 0;
for(i = 0; i <= stuffNum; i++)
dist[i] = graph[0][i];
for(i = 0; i < stuffNum; i++){
minPath = INF;
for(j = 0; j <= stuffNum; j++){
if(minPath > dist[j] && !visited[j]){
minPath = dist[j];
startPos = j;
}
}
visited[startPos] = true;
for(j = 0; j <= stuffNum; j++){
if(dist[j] > minPath + graph[startPos][j] && !visited[j])
dist[j] = minPath + graph[startPos][j];
}
}
return dist[1];
}
void printGraph(){
for(int i = 0; i <= stuffNum; i++){
for(int j = 0; j <= stuffNum; j++){
if(graph[i][j] == 16843009)
cout<<"INF ";
else
cout<<graph[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
//freopen("in.txt", "r", stdin);
int i, j, beginPos, weight, pathNum;
memset(graph, 1, sizeof(graph));
cin>>rankGap>>stuffNum;
for(i = 1; i <= stuffNum; i++){
cin>>weight>>Rank[i]>>pathNum;
graph[0][i] = weight;
for(j = 0; j < pathNum; j++){
cin>>beginPos>>weight;
graph[beginPos][i] = weight;
}
}
int res = INF;
for(i = Rank[1] - rankGap; i <= Rank[1]; i++)
res = min(res, Dijkstra(i, i + rankGap));
cout<<res<<endl;
}
相关文章推荐
- JavaScript基础教程01编辑器的选择和两种链接方法
- 1007 DNA Sorting(字符串+逆序数)
- 训练集(train set) 验证集(validation set) 测试集(test set)
- 中国历史上成功的两人合作
- 菜单
- HDU 3535 分组混合背包
- C++继承之后的访问方式
- ava对数组元素排序的三种方式
- Mac 使用SSH远程登录
- 使用SharedPreferences保存用户名和密码
- poj 3693 后缀数组 重复次数最多的连续重复子串
- 三角形1
- STM32入门之模板建立
- Java之数据库篇
- poj 3693 后缀数组 重复次数最多的连续重复子串
- 第六、七周周总结
- jquery使用注意事项总结1
- IOS学习 NSOperation 并发数量、暂停/继续、取消、等待、依赖 与GCD区别
- QT控件被其他控件遮盖
- Exchange 部署边缘服务器