浙大PAT 1003题 1003. Emergency

2024-02-26 22:18
文章标签 浙大 pat 1003 emergency

本文主要是介绍浙大PAT 1003题 1003. Emergency,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本题用Dfs搜索或者Dijkstra算法都可以,当然也有其它的方法。这题感觉是pat中常见的类型,非常重要。

Dfs搜索代码:

#include<stdio.h>
int road[510][510],vst[510],hper[510];
int N,M,C1,C2,shpath=-1,maxhp=-1,cnt=0;
int main(){
void dfs(int from,int len,int helpers);
int i,j;
int c1,c2,l;
scanf("%d %d %d %d",&N,&M,&C1,&C2);
for(i=0;i<N;i++){
scanf("%d",&hper[i]);
vst[i]=0;
for(j=0;j<N;j++){
road[i][j]=-1;
road[j][i]=-1;
}
}
for(i=0;i<M;i++){
scanf("%d %d %d",&c1,&c2,&l);
road[c1][c2]=l;
road[c2][c1]=l;
}
vst[C1]=1;
dfs(C1,0,hper[C1]);
printf("%d %d\n",cnt,maxhp);
return 0;
}
void dfs(int from,int len,int helpers){
int i,j;
if(len>shpath&&shpath!=-1){
return;
}
if(from==C2){
if(len<shpath||shpath==-1){
shpath=len;
maxhp=helpers;
cnt=1;
}
else if(len==shpath){
cnt++;
if(helpers>maxhp){
maxhp=helpers;
}
}
return;
}
for(i=0;i<N;i++){
if(vst[i]==0&&road[from][i]!=-1){
vst[i]=1;
dfs(i,len+road[from][i],helpers+hper[i]);
vst[i]=0;
}
}
} 


Dijstra算法代码:

#include<stdio.h>
#define maxint 1<<28
int N,M,C1,C2;
int map[510][510],vst[510],dis[510],hel[510];
int pathcnt[510],pathhel[510];
void init(){
int i,j;
for(i=1;i<=N;i++){
vst[i]=0;
hel[i]=0;
dis[i]=maxint;
pathcnt[i]=0;
pathhel[i]=0;
for(j=1;j<=N;j++){
map[i][j]=map[j][i]=maxint;
}
}
}
void Dijstra(){
int i,j,k;
dis[C1]=0;
pathcnt[C1]=1;
pathhel[C1]=hel[C1]; 
for(i=1;i<=N;i++){
int imin=maxint;
for(j=1;j<=N;j++){
if(!vst[j]&&dis[j]<imin){
imin=dis[j];
k=j;
}
}
vst[k]=1;
for(j=1;j<=N;j++){
if(vst[j]==0){ 
if(dis[j]>dis[k]+map[k][j]){
dis[j]=dis[k]+map[k][j];
pathhel[j]=pathhel[k]+hel[j];
pathcnt[j]=pathcnt[k];
}
else if(dis[j]==dis[k]+map[k][j]){
pathcnt[j]+=pathcnt[k];
if(pathhel[j]<pathhel[k]+hel[j]){
pathhel[j]=pathhel[k]+hel[j];	
}
}	
}
}
if(imin==maxint||k==C2) return;
}
}
int main(){
int i,j,from,to,dist;
scanf("%d %d %d %d",&N,&M,&C1,&C2);
C1++;
C2++;
init();
for(i=1;i<=N;i++){
scanf("%d",&hel[i]);	
}
for(i=1;i<=M;i++){
scanf("%d %d %d",&from,&to,&dist);
map[from+1][to+1]=map[to+1][from+1]=dist;
}
Dijstra();
printf("%d %d\n",pathcnt[C2],pathhel[C2]);
return 0;
}


 

这篇关于浙大PAT 1003题 1003. Emergency的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750327

相关文章

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

浙大数据结构——03-树1 树的同构

这道题我依然采用STL库的map,从而大幅减少了代码量 简单说一下思路,两棵树是否同构,只需比较俩树字母相同的结点是否同构,即是否左==左,右==右或者左==右,右==左。 1、条件准备 atree和btree是存两个数结点字母,第几个就存输入的第几个结点的字母。 map通过结点的字母作为键,从而找到两个子节点的信息 都要用char类型 #include <iostream>#inc

浙大数据结构:堆栈和队列的定义与操作

堆栈: 顺序存储: #include<stdio.h>#include<stdlib.h>typedef int ElementType ;typedef int position ;#define MAXSIZE 100#define ERROR -1struct SNode {ElementType * Data ;position top;int Maxsize;};

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L

浙大数据结构:01-复杂度2 Maximum Subsequence Sum

数据结构MOOC PTA习题 01-复杂度2 Maximum Subsequence Sum #include <iostream>using namespace std;const int M = 100005;int a[M];int main(){int k;cin >> k;int f = 1;for (int i = 0; i < k; i++){cin >> a[i

九度考研真题 浙大 2011-3浙大1004:Median

题目1004:Median //#include<iostream> //long long a1[1000010],a2[1000010]; //using namespace std; //int main(){ // long long n1,n2; // long long num; // // long long t; // wh

九度考研真题 浙大 2011-2浙大1002:Grading

题目1002:Grading #include<iostream> #include<stdio.h> #include<math.h>  using namespace std; int main() { double P,T,G1,G2,G3,Gj; double num; while(cin>>P) { cin>>T>>G1>>G2>>G