【qduoj - 1121】小明的贪心题(Dijkstra最短路 + 最短路条数)

题干:

小明的贪心题

描述

 

小明来到青岛上学已经一年了,他给青岛这座城市画了一张地图。在这个地图上有n个点,小明的起始点为1号点,终点为n号点,并且地图上的所有边都是单向的。小明知道从i号点到j号点的时间花费为w分钟,那么问题来了,求从1号点到n号的最小时间花费是多少?这个最少花费的路径有多少条?

输入

 

输入格式:输入文件第一行为两个空格隔开的数n,m,表示这张地图里有多少个点及有多少边的信息。下面m行,每行三个数I、J、w,表示从I点到J点有道路相连且花费为w.(注意,数据提供的边信息可能会重复,不过保证I<>J,1<=I,J<=n)。1<=N<=2100,0<=m<=N*(N-1), 1<=w<=2100.

输出

 

输出格式:输出文件包含两个数,分别是最少花费和花费最少的路径的总数.两个不同的最短路方案要求:路径长度相同(均为最短路长度)且至少有一条边不重合。若城市N无法到达则只输出一个(‘No answer’);

输入样例 1 

5 4
1 5 4
1 2 2
2 5 2
4 1 1

输出样例 1

4 2

输入样例 2 

100 1
1 2 1

输出样例 2

No answer

解题报告:

     这题比赛的时候坑的我好苦啊,一个小错误(不过也确实以前都没注意这个小地方,大概还是做双权值的题做少了),最后前十都没进。。。这么简单的一道最短路条数,就因为少了一个vis的if判断,然后就GG思密达。不过还是有很多地方是值得注意的。比如这题需要去重边。(直接邻接矩阵去重边就可以了,因为数据量2000也不算大)

AC代码:

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int INF = 0x3f3f3f3f; 
const ll INFINF = 0x3f3f3f3f3f3f3f3f;
int n,m,top;
int head[5000 +5];
ll dis[5005],ans[5005];
bool vis[5005];
ll maze[5005][5005];
struct Edge{int to,ne;ll w;
} e[5000000 +5];
struct point {int pos;ll c;point(){}point(int pos,ll c):pos(pos),c(c){}bool operator <(const point & b) const {return c>b.c;}
};
void add(int u,int v,ll w) {e[++top].to = v;e[top].w=w;e[top].ne = head[u];head[u] = top;
}
void Dijkstra(int u,int v) {priority_queue<point> pq; for(int i = 1; i<=n; i++) dis[i] = INFINF;memset(vis,0,sizeof vis);memset(ans,0,sizeof ans);ans[u]=1;dis[u] = 0;point cur = point(u,0);pq.push(cur);while(!pq.empty()) {point now = pq.top();pq.pop();
//		if(vis[now.pos] == 1) continue;vis[now.pos] = 1;for(int i = head[now.pos]; i!=-1; i=e[i].ne) {if(vis[e[i].to] == 1) continue;if(  dis[e[i].to] > dis[now.pos] + e[i].w ) {dis[e[i].to] = dis[now.pos] + e[i].w;ans[e[i].to] = ans[now.pos];pq.push(point(e[i].to,dis[e[i].to] ) );	}else if(dis[e[i].to] == dis[now.pos] + e[i].w) {ans[e[i].to] += ans[now.pos];}} }if(dis[v] == INFINF) puts("No answer");else {printf("%lld %lld\n",dis[v],ans[v]);}
} 
int main()
{int a,b;ll w;while(~scanf("%d%d",&n,&m)) {top=0;memset(head,-1,sizeof head);
//		memset(maze,INF,sizeof maze);for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {maze[i][j] = INFINF;}}for(int i = 1; i<=m; i++) {scanf("%d %d %lld",&a,&b,&w);if(maze[a][b]>w) maze[a][b]=w;}for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {if(maze[i][j]<10000) {add(i,j,maze[i][j]);}}}Dijkstra(1,n); }return 0 ;
}
//5 4
//1 5 4
//1 2 2
//2 5 2
//4 1 1

AC代码2:

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int INF = 0x3f3f3f3f; 
const ll INFINF = 0x3f3f3f3f3f3f3f3f;
int n,m,top;
int head[5000 +5];
ll dis[5005],ans[5005];
bool vis[5005];
ll maze[5005][5005];
struct Edge{int to,ne;ll w;
} e[5000000 +5];
struct point {int pos;ll c;point(){}point(int pos,ll c):pos(pos),c(c){}bool operator <(const point & b) const {return c>b.c;}
};
void add(int u,int v,ll w) {e[++top].to = v;e[top].w=w;e[top].ne = head[u];head[u] = top;
}
void Dijkstra(int u,int v) {priority_queue<point> pq; for(int i = 1; i<=n; i++) dis[i] = INFINF;memset(vis,0,sizeof vis);memset(ans,0,sizeof ans);ans[u]=1;dis[u] = 0;point cur = point(u,0);pq.push(cur);while(!pq.empty()) {point now = pq.top();pq.pop();if(vis[now.pos] == 1) continue;vis[now.pos] = 1;for(int i = head[now.pos]; i!=-1; i=e[i].ne) {
//			if(vis[e[i].to] == 1) continue;if(  dis[e[i].to] > dis[now.pos] + e[i].w ) {dis[e[i].to] = dis[now.pos] + e[i].w;ans[e[i].to] = ans[now.pos];pq.push(point(e[i].to,dis[e[i].to] ) );	}else if(dis[e[i].to] == dis[now.pos] + e[i].w) {ans[e[i].to] += ans[now.pos];}} }if(dis[v] == INFINF) puts("No answer");else {printf("%lld %lld\n",dis[v],ans[v]);}
} 
int main()
{int a,b;ll w;while(~scanf("%d%d",&n,&m)) {top=0;memset(head,-1,sizeof head);
//		memset(maze,INF,sizeof maze);for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {maze[i][j] = INFINF;}}for(int i = 1; i<=m; i++) {scanf("%d %d %lld",&a,&b,&w);if(maze[a][b]>w) maze[a][b]=w;}for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {if(maze[i][j]<10000) {add(i,j,maze[i][j]);}}}Dijkstra(1,n); }return 0 ;
}
//5 4
//1 5 4
//1 2 2
//2 5 2
//4 1 1

总结:

   所以保险起见,还是两个if剪枝都写上吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs 监控linux,linuxServerMonitoring

linux服务器监控平台技术&#xff1a;nodejs vue java mongodb springboot linux shelllinux服务器监控项目&#xff0c;前后端分离vuespringbootmongodb&#xff1a;1、启动前台&#xff1a;使用命令&#xff1a;A 先安装nodejs并配置好环境变量B 先控制台cmd命令切换到项目目…

【qduoj - 纳新题】小明的dp(快速幂 + 乘法原理)(简单组合数学)

题干&#xff1a; 描述 小明有n种珠宝&#xff0c;每种无限个&#xff0c;他想从这些珠宝中取出m个&#xff0c;编成手链&#xff08;长链哦&#xff09;&#xff0c;并按顺序排列起来&#xff0c;为了好看&#xff0c;相邻的珠宝不能相同。小明想知道有多少种排列的方法。 输…

linux查看显卡核心数,linux查看硬件信息,linux查看硬盘信息,linux查看CPU信息,linux查看显卡,硬件型号信息 | 帮助信息-动天数据...

linux查看硬件信息,linux查看硬盘信息,linux查看CPU信息,linux查看显卡,硬件型号信息作者&#xff1a;dthost |时间&#xff1a;2015-09-30 |8,325 次阅读linux服务器大家都知道&#xff0c;他和WIN系统不一样&#xff0c;他不能和WIN电脑一样&#xff0c;用桌面的电脑属性查看…

【qduoj - 纳新题】凑数题(恰好装满类0-1背包 或 母函数)

题干&#xff1a; 描述 小Q手里有n枚硬币&#xff0c;每枚硬币有一定的金额x,他想知道&#xff0c;用这些硬币能组成多少种不同的金额。但是他太笨了&#xff0c;自己数懵了&#xff0c;你来帮帮他好不好&#xff1f; 注意&#xff1a;组成金额时&#xff0c;每枚硬币只能用一…

c语言中short作用,C语言short

C语言short教程C语言short定义详解语法short int varname value;short varname1 value2; //简写形式参数参数描述short int定义 short 类型变量使用的类型。varname变量名。value可选&#xff0c;变量的初始值&#xff0c;该值不可以超过 short 类型的最大值。说明使用 short…

dls的BM算法模板(线性递推问题,解决矩阵快速幂解决不了的问题)

模板&#xff1a;往里面扔数就可以了&#xff08;据说>8个&#xff1f;&#xff09;%%%dls https://www.cnblogs.com/zzqsblog/p/6877339.html #include<bits/stdc.h> using namespace std; #define rep(i,a,n) for (int ia;i<n;i) #define per(i,a,n) for (int …

c语言课题设计字符串处理函数报告,C语言输入输出库函数设计实验报告.doc

C语言输入输出库函数设计实验报告第 PAGE \* MERGEFORMAT I页 共 SECTIONPAGES \* MERGEFORMAT 1页华中科技大学计算机科学与技术学院C语言课程设计报告题目: C输入输出库函数的程序设计专 业&#xff1a; 计算机科学与技术班 级&#xff1a; CS1202学 号&#xff1a; U2012148…

【HDU - 1847】Good Luck in CET-4 Everybody! (巴什博奕,PN图或sg函数)

题干&#xff1a; 大学英语四级考试就要来临了&#xff0c;你是不是在紧张的复习&#xff1f;也许紧张得连短学期的ACM都没工夫练习了&#xff0c;反正我知道的Kiki和Cici都是如此。当然&#xff0c;作为在考场浸润了十几载的当代大学生&#xff0c;Kiki和Cici更懂得考前的放松…

词法分析器c语言带注释,C语言词法分析器内容说明注释完整可运行代码.doc-资源下载在线文库www.lddoc.cn...

C语言词法分析器_内容说明注释完整_可运行代码.doc1. 实验目的及要求 本次实验通过用 C 语言 设计、编制、调试一个词法分析子程序&#xff0c;识别单词&#xff0c;实现一个 C 语言词法分析器&#xff0c;经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境运行环境…

【HDU - 2516 】取石子游戏 (Fibonacci博弈)

题干&#xff1a; 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个&#xff0c;但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win". Input 输入有多组.每组第1行是2<n<…

打印心形c语言,C语言打印心形

#include int main() {for (float y 1.5f; y > -1.5f; y - 0.1f) {for (float x -1.5f; x < 1.5f; x 0.05f) {float a x * x y * y - 1;putchar(a * a * a - x * x * y * y * y < 0.0f ? ‘*‘ : ‘ ‘);}putchar(‘\n‘);}}**********************************…

【HDU - 1564 】Play a game (博弈问题,找规律,奇偶博弈)

题干&#xff1a; New Year is Coming! ailyanlu is very happy today! and he is playing a chessboard game with 8600. The size of the chessboard is n*n. A stone is placed in a corner square. They play alternatively with 8600 having the first move. Each time…

c语言学生对老师的评教系统,学生对老师的评价

学生对老师的评价1、老师授课的方式十分适合我们&#xff0c;他根据本课程知识结构的特点&#xff0c;重点突出&#xff0c;层次分明。理论和实际相结合&#xff0c;透过例题使知识更条理化。但授课速度有点快&#xff0c;来不及记录。2、老师在生活工作中给人的感觉是生活朴素…

*【HDU - 1517】【POJ - 2505】A Multiplication Game(博弈,递推找规律或SG函数)

题干&#xff1a; Stan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p 1, does his multiplication, then Ollie multiplies the number, then Stan and so on. Before a game starts, t…

android 怎么获取app 字体颜色,android app 修改字体

android中可能会遇到修改字体的情况&#xff0c;虽然说需求比较少&#xff0c;但是偶尔还会遇到可以使用三方框架来帮助我们简单做到api "uk.co.chrisjenx:calligraphy:2.2.0"在style文件中添加一个字体的stylefonts/Roboto-Thin.ttf我app中的main/assert/fonts/Robo…

【HDU - 1254 】推箱子 (双bfs)

题干&#xff1a; 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙…

android 退出函数,android – 关闭应用程序与退出按钮

下面使用main.xml文件android:orientation"vertical" android:layout_width"fill_parent"android:layout_height"fill_parent">android:layout_height"wrap_content" android:id"id/txt1" android:text"txt1" …

算法讲解 -- 莫队算法

摘要&#xff1a; 莫队算法是一个对于区间、树或其他结构离线&#xff08;在线&#xff09;维护的算法&#xff0c;此算法基于一些基本算法&#xff0c;例如暴力维护&#xff0c;树状数组&#xff0c;分块&#xff0c;最小曼哈顿距离生成树&#xff0c;对其进行揉合从而产生的一…

android标题栏消失,安卓标题栏为什么没有显示

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼用Eclipse开发的APP&#xff0c;其中一个Activit的标题栏没有显示&#xff0c;但没对Activity做过任何配置。由于不知道哪里出问题&#xff0c;下面把Activity的java文件、布局文件和Mainfest全部放出来Activity.java-------------…

知识点 组合数学 卡特兰数

关于卡特兰数 卡特兰数是一种经典的组合数&#xff0c;经常出现在各种计算中&#xff0c;其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 914…