T292306 01最短路 题解

又是一个找不到题目所以自己写的题。。。

20 迪杰斯特拉,然而开O2跑得比正解还快。。。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1e6 + 5, M = 1e6 + 5;

int n, m, s;
int dis[N];
struct edge
{
	int v, nxt, w;
} e[M << 1];
int head[N], cnt;
bool vis[N];

inline int read()
{
	int x = 0; char ch = getchar();
	for (; ch < '0' || ch > '9'; ch = getchar());
	for (; ch >= '0' && ch <= '9'; ch = getchar())
		x = (x << 1) + (x << 3) + (ch ^ '0');
	return x;
}

void add(int u, int v, int w)
{
	e[++cnt] = (edge){v, head[u], w};
	head[u] = cnt;
}

void bfs()
{
	memset(dis, 0x3f, sizeof dis);
	dis[s] = 0;
	priority_queue <pair<int, int> > q;
	q.push(make_pair(0, s));
	while (!q.empty())
	{
		int x = q.top().second;
		q.pop();
		if (vis[x]) continue;
		vis[x] = 1;
		for (int i = head[x]; i; i = e[i].nxt)
		{
			int v = e[i].v;
			if (dis[v] > dis[x] + e[i].w)
			{
				dis[v] = dis[x] + e[i].w;
				q.push(make_pair(-dis[v], v));
			}
		}
	}
}

int main()
{
	//freopen("data.txt", "r", stdin);
	n = read(), m = read(), s = 1;
	for (int i = 1; i <= m; i ++ )
	{
		int u = read(), v = read(), w = read();
		add(u, v, w);
		add(v, u, w);
	}
	bfs();
	for (int i = 1; i <= n; i ++ )
		printf("%d ", vis[i] ? dis[i] : -1);
	return 0;
}

100

#include<bits/stdc++.h>
#define for1(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b);
using namespace std;
struct node{
	int w;
	int nex;
	int to;
}a[2000005*3];
int hd[2000005],cnt,ans[2000005];
int n,m,s,t;
bool vis[2000005];
int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

void ru(int x,int y,int z)
{
	a[++cnt].to=y;
	a[cnt].w=z;
	a[cnt].nex=hd[x];
	hd[x]=cnt;
}

void bfs()
{
	deque <int > dl;
	for1(i,1,n) ans[i]=1e8;
	ans[s]=0;
	dl.push_front(s);
	while(!dl.empty())
	{
		int x=dl.front();
		dl.pop_front();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=hd[x];i;i=a[i].nex)
		{
			int v=a[i].to;
			if(ans[v]>ans[x]+a[i].w)
			{
				ans[v]=ans[x]+a[i].w;
				if(a[i].w==1) dl.push_back(v);
				else dl.push_front(v);
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	s=1;
	for1(i,1,m)
	{
		int x,y,z;
		cin>>x>>y>>z;
		ru(x,y,z);
		ru(y,x,z);
	}
	bfs();
	for1(i,1,n) 
	if(ans[i]==1e8) printf("%d ",-1);
	else printf("%d ",ans[i]);
} 

__EOF__

  • 本文作者: yyx525jia
  • 本文链接: https://www.cnblogs.com/yyx525jia/p/16897464.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • posted @   yyx525jia  阅读(17)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 本地部署 DeepSeek:小白也能轻松搞定!
    · 如何给本地部署的DeepSeek投喂数据,让他更懂你
    · 从 Windows Forms 到微服务的经验教训
    · 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
    · 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
    点击右上角即可分享
    微信分享提示