PAT Emergency dijsktra

2023-12-19 20:58
文章标签 pat emergency dijsktra

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




首先wa了好多次,只有第一个答案是正确的,后来才知道原来是第一个输出是最短路径的个数,一直以为是最短路径。。。。无语了,代码中d[i]代表从c1到节点i的最短路径个数,sum[i]代表最短路径中能集结的最多救援队数,在每次更新节点路径长度的时候要考虑对他们该如何操作。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 0x7fffffff - 1000000
long long int gra[505][505];
int num[505];
int d[505];
int n,m,c1,c2,counter;
int visit[505];
int sum[505];int dijsktra()
{int i,j;memset(visit,0,sizeof(visit));visit[c1] = 1;int now = c1;int min;for(i=0; i<n; i++)sum[i] = num[i];sum[c1] = num[c1];for(j=0; j<n; j++){for(i=0; i<n; i++){if(!visit[i]&& gra[c1][i] >= gra[c1][now]+gra[now][i]){if(gra[c1][i] == gra[c1][now]+gra[now][i]){if(now == c1){if(gra[c1][i] == Max)d[i] = 0;elsed[i] = 1;}	elsed[i]+= d[now];if(sum[now]+num[i] > sum[i])sum[i] = sum[now] + num[i];}else{sum[i] = sum[now]+num[i];gra[c1][i] = gra[c1][now]+gra[now][i]; 	d[i] = d[now];}}}min = Max;for(i=0; i<n; i++){if(!visit[i] && gra[c1][i] < min){min = gra[c1][i];now = i;}}visit[now] = 1;if(now == c2)break;}return 0;
}
int main()
{int i,j,a,b,c;scanf("%d%d%d%d",&n,&m,&c1,&c2);for(i=0; i<n; i++)scanf("%d",&num[i]);	for(i=0; i<n; i++)for(j=0; j<n; j++){gra[i][j] = Max;if(i == j)gra[i][j] = 0;} 		for(i=0; i<m; i++){scanf("%d%d%d",&a,&b,&c);gra[a][b] = gra[b][a] = c;}if(c1 == c2){printf("%d %d\n",1,num[c2]);return 0;}	dijsktra();printf("%d %d\n",d[c2],sum[c2]);return 0; 
} 


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



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

相关文章

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

PAT (Advanced Level) Practice

1001:  题目大意: 计算 a+b 的结果,并以标准格式输出——即每三个数字一组,组之间用逗号分隔(如果数字少于四位,则不需要逗号分隔)  解析: 我们知道相加右正有负,对于样例来说 Sample Input: -1000000 9 Sample Output: -999,991 如果是从左往右,算上负号的话输出应该是-99,999,1 从右往左:-,999,991离正确

1050 String Subtraction——PAT甲级

Given two strings S1​ and S2​, S=S1​−S2​ is defined to be the remaining string after taking all the characters in S2​ from S1​. Your task is simply to calculate S1​−S2​ for any given strings. However,

1105 链表合并——PAT乙级

给定两个单链表 L1​=a1​→a2​→⋯→an−1​→an​ 和 L2​=b1​→b2​→⋯→bm−1​→bm​。如果 n≥2m,你的任务是将比较短的那个链表逆序,然后将之并入比较长的那个链表,得到一个形如 a1​→a2​→bm​→a3​→a4​→bm−1​⋯ 的结果。例如给定两个链表分别为 6→7 和 1→2→3→4→5,你应该输出 1→2→7→3→4→6→5。 输入格式: 输入首先在第一

1110 区块反转——PAT乙级

给定一个单链表 L,我们将每 K 个结点看成一个区块(链表最后若不足 K 个结点,也看成一个区块),请编写程序将 L 中所有区块的链接反转。例如:给定 L 为 1→2→3→4→5→6→7→8,K 为 3,则输出应该为 7→8→4→5→6→1→2→3。 输入格式: 每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤105)、以及正整数 K (

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以

PAT-1028

题目描述 某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。 输入描述: 输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个

每日一题——Python代码实现PAT乙级1048 数字加密(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试  再次尝试 代码点评 代码结构 时间复杂度 空间复杂度 优化建议 我要更强 优化建议 完整代码及注释 时间复杂度和空间复杂度分析 进一步优化 哲学和编程思想 模块化

PAT-L1-020 帅到没朋友

L1-020 帅到没朋友 (20 分) 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。 输入格式: 输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),I