2019BNUZ校内赛现场赛A.Level Up【最短路】

题目大意

给你n个点(n<=1000),m条有向边,求点a到点b的最短路,如果没有输出-1.
这里面有一个条件,你可以将m条边中任意一条边的权值整除2

题解

比赛的时候,一直没想到如何优化,比赛完之后,大佬对我说,这么简单的最短路都不会,QAQ…, 然后跟我说了一下思路,问我最短路堆优化是不是每一次都要往优先队列里面塞一个点,那就在塞的过程中,对这个点做一下标记就好了,想了一下午,才想出来,QAQ,感觉就跟DP差不多的原理,真的很菜,直接把kuangbin版 Dijkstra+堆优化改一改就好了,太菜了

AC_code:

/*
* 使用优先队列优化 Dijkstra 算法
* 复杂度 O(ElogE)
* 注意对 vector<Edge>E[MAXN] 进行初始化后加边
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;


const ll INF=1000000005LL;
const int MAXN=1005;
struct qnode {
	int v;
	ll c;
	int flag;// 1表示已经使用了技能卡  0表示没有
	qnode(int _v=0,ll _c=0,int _flag=0):v(_v),c(_c),flag(_flag) {}
	bool operator <(const qnode &r)const {
		return c>r.c;
	}
};
struct Edge {
	int v;
	ll cost;
	Edge(int _v=0,ll _cost=0):v(_v),cost(_cost) {}
};
vector<Edge>E[MAXN];
bool vis[2][MAXN];// 1表示已经使用了技能卡  0表示没有
ll dist[2][MAXN];// 1表示已经使用了技能卡  0表示没有
//点的编号从 1 开始
void Dijkstra(int n,int start) {
	memset(vis,false,sizeof(vis));
	for(int i=1; i<=n; i++)dist[0][i]=dist[1][i]=INF;
	priority_queue<qnode>que;
	while(!que.empty())que.pop();
	dist[0][start]=dist[1][start]=0;
	que.push(qnode(start,0,0));
	qnode tmp;
	while(!que.empty()) {
		tmp=que.top();
		que.pop();
		int u=tmp.v;
		int flag=tmp.flag;
		if(vis[flag][u])continue;
		vis[flag][u]=true;
		int len=E[u].size();
		for(int i=0; i<len; i++) {
			int v=E[u][i].v;
			ll cost=E[u][i].cost;
			if(!vis[flag][v]&&dist[flag][v]>dist[flag][u]+cost) {
				dist[flag][v]=dist[flag][u]+cost;
				que.push(qnode(v,dist[flag][v], flag));
			}
			if(!vis[1][v]&&dist[1][v]>dist[0][u]+cost/2&&!flag) {
				dist[1][v]=dist[0][u]+cost/2;
				que.push(qnode(v,dist[1][v], 1));
			}
		}
	}
}
void addedge(int u,int v,ll w) {
	E[u].push_back(Edge(v,w));
}
int main() {
	int t, cas = 1;
	scanf("%d", &t);
	while(t--) {
		printf("Case #%d:\n",cas++);
		int n, m;
		scanf("%d %d", &n, &m);
		for(int i = 1; i <= n; i++) {
			E[i].clear();
		}
		ll ans = 0;
		int a, b;
		ll c;
		while(m--) {
			scanf("%d %d %lld", &a, &b, &c);
			addedge(a, b, c);
		}
		int x, y;
		scanf("%d %d", &x, &y);
		Dijkstra(n, x);
		ans = min(dist[0][y],dist[1][y]);
		if(ans == INF) {
			printf("-1\n");
		} else
			printf("%lld\n", ans);
	}
	return 0;
}
全部评论

相关推荐

Ryan188:我觉得你简历最核心的问题就是太大众化。 你要有一个认知就是,如果你是面试官,你是HR,其实他们每天都会收到非常多大量重复的像你这种简历。 就是说你的项目不是一个真实的上线的项目,可能是从网上学习而来的,或者是直接copy别人的项目,没有新意,没有展现出你自己对技术的思考,而且你的学历也不占优,自然而然就很难有人去选择你。 所以要做的实际上是差异化方向的工作,也就是“给我一个选择你的理由”,比如最近很火的ai,你可以写一个ai相关项目比如问答应用或者mcp编写或者agent搭建,需要你先花点时间学习,34天吧,展现你对这方面相较于其他人特有的思考; 或者写相关技术博客输出一些技术内容,有具体可以量化的成果等等去增加你的竞争力。 但以上这些都是后话,我去年在你这个时候也是没人理我,咱们双非学历也没实习,难找也正常,我当时整个3月份都没人鸟我,直到有个新招的岗位,很缺人很急,流程很快,所以我一下子进去了,所以运气方面也很重要,需要你一直坚持喝复盘,直到看到光明,加油兄弟
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务