萌新求助QwQ
查看原帖
萌新求助QwQ
233501
Dangerou楼主2021/10/15 08:05

93分求调 QwQ

挂了第 33 个测试点,就很离谱 QAQ

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
inline int read()
{
    int num=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {num=(num<<1)+(num<<3)+ch-'0';ch=getchar();}
    return num*w;
}
int n,m,u,v,w,tmp;
int head[1000001],tot;
int h[1000001],lol;
struct node
{
	int from;
	int to;
	int nex;
	int w;
}g[1000001],mapp[1000001];
int dfn[1000001],cnt;
int low[1000001];
int stac[1000001],top;
bool vis[1000001];
bool vi[1000001];
int fa[1000001];
int dis[1000001];
inline void add_1(int xx,int yy,int w)
{
	g[++tot]=(node){xx,yy,head[xx],w};
	head[xx]=tot;
	return;
} 
inline void add_2(int xx,int yy,int w)
{
	mapp[++lol]=(node){xx,yy,h[xx],w};
	h[xx]=lol;
	return;
}
inline void tanjor(int k)
{
	dfn[k]=low[k]=++cnt;
	vis[k]=1;
	stac[++top]=k;
	for(int i=head[k];i;i=g[i].nex)
	{
		int to=g[i].to;
		if(!dfn[to]) tanjor(to),low[k]=min(low[k],low[to]);
		else if(vis[to]) low[k]=min(low[k],dfn[to]);
	}
	if(low[k]==dfn[k])
	{
		fa[k]=++tmp;
		while(stac[top]!=k)
		{
			vis[stac[top]]=0;
			fa[stac[top]]=tmp;
			top--;
		} 
		top--;
	}
	return;
}
priority_queue<pair<int,int> > q;
inline void dijkstra()
{
	memset(dis,0x3f3f3f,sizeof(dis));
	dis[fa[1]]=0;
	q.push(make_pair(0,fa[1]));
	while(q.size())
	{
		u=q.top().second;
		q.pop();
		if(vi[u]) continue;
		vi[u]=1;
		for(int i=h[u];i;i=mapp[i].nex)
		{
			v=mapp[i].to;
			if(dis[u]+mapp[i].w<dis[v])
			{
				dis[v]=dis[u]+mapp[i].w;
				q.push(make_pair(-dis[v],v));
			}
		}		
	}
}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n=read(),m=read();
	for(register int i=1;i<=m;i++) u=read(),v=read(),w=read(),add_1(u,v,w);
	for(register int i=1;i<=n;i++) if(!dfn[i]) tanjor(i);
	for(int i=1;i<=m;i++)
	{
		if(fa[g[i].from]!=fa[g[i].to])
		{
			add_2(fa[g[i].from],fa[g[i].to],g[i].w);
		}
	}
	dijkstra();
	printf("%d\n",dis[1]);
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}
2021/10/15 08:05
加载中...