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__
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee