ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

YbtOJ 「图论」第3章 最短路径

2022-08-20 13:33:04  阅读:135  来源: 互联网

标签:图论 ch int YbtOJ memset head 最短 include dis


例题1.单源最短路径

dij 板子。(w36557658 原版 dij 代码!

code
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first

#define se second

using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
const int N=100005;
const int M=500005;
const int INF=2147483647;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
struct node{
    int w,to,nxt;
}e[M];
int n,m,k,p,cnt,head[N],dis[N];
bool vis[N];
inline void add(int u,int v,int w){
    e[++cnt].to=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
priority_queue<pii,vector<pii>,greater<pii> >q;
void dij(int s){
    dis[s]=0;q.push(pii(0,s));
    while(!q.empty()){
        int u=q.top().se,f=q.top().fi;q.pop();
        if(f!=dis[u])continue;
        for(int i=head[u];i;i=e[i].nxt){
            int v=e[i].to,w=e[i].w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                q.push(pii(dis[v],v));
            }
        }
    }
    return;
}
int main(){
    int n=read(),m=read(),s=read();
    for(int i=1;i<=n;i++)dis[i]=INF;
    for(int i=1;i<=m;i++){
        int u=read(),v=read(),w=read();
        add(u,v,w);
    }
    dij(s);
    for(int i=1;i<=n;i++)printf("%d ",dis[i]);
    return 0;
}

例题2.负环判断

板子。坑人,交了一面才发现 std 没清空队列导致数据锅了。
写的时候记得不要清空队列(bushi

code
#include<bits/stdc++.h>
using namespace std;
const int N=6e4+5;
int T,n,m;
int head[N],cnt;
struct node{
	int nxt,to,w;
}e[N];
void add(int u,int v,int w){
	e[++cnt]={head[u],v,w};head[u]=cnt;
}
int dis[N],in[N],vis[N];
queue<int> q;
bool spfa(int s)
{
	memset(dis,0x3f3f3f3f,sizeof(dis));
	memset(in,0,sizeof(in));
	memset(vis,0,sizeof(vis));
	
	q.push(s);in[s]=1;dis[s]=0;
	while(!q.empty())
	{
		int u=q.front();q.pop();in[u]=0;
		//cout<<u<<endl;
		for(int i=head[u];i;i=e[i].nxt)
		{
			int v=e[i].to;
			if(dis[u]+e[i].w<dis[v])
			{
				dis[v]=dis[u]+e[i].w;
				vis[v]=vis[u]+1;
				if(vis[v]>=n) return 0;
				if(!in[v])
				{
					in[v]=1;
					q.push(v);
				}
			}
		}
	}
	return 1;
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{ 
		memset(e,0,sizeof(e));
		memset(head,0,sizeof(head));cnt=0;
		scanf("%d%d",&n,&m);
		for(int i=1,u,v,w;i<=m;i++)
		{
			scanf("%d%d%d",&u,&v,&w);
			if(w>=0) add(u,v,w),add(v,u,w);
			else add(u,v,w);
		}
		if(!spfa(1)) cout<<"YE5"<<endl;
		else cout<<"N0"<<endl;
	}
	return 0;
}

标签:图论,ch,int,YbtOJ,memset,head,最短,include,dis
来源: https://www.cnblogs.com/ying-xue/p/16607559.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有