3个TLE,救助!!!
  • 板块P1342 请柬
  • 楼主Amy28
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/5/21 19:43
  • 上次更新2023/10/28 00:55:55
查看原帖
3个TLE,救助!!!
300828
Amy28楼主2022/5/21 19:43
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
struct edge
{
	int node;
	int w;
	edge(int node_,int w_):
		node(node_),w(w_){}
};
const long long u=2000005;
vector<edge> v[u];
long long dis[u];
bool vis[u];
int n,m,s(1);
inline int read()
{
    char ch=getchar();
	register int x=0,f=1;
    while(ch<'0' || ch>'9')    
	{
	 	if(ch=='-')f=-1;
		ch=getchar();
	}
    while(ch>='0' && ch<='9')
	{
	 	x=x*10+ch-'0';
		ch=getchar();
	}
    return x*f;
}
inline void write(long long N)
{
    if(N<0) putchar('-'),N=~(N-1);
    register int s[20],top=0;
    while(N) s[++top]=N%10,N/=10;
    if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
    putchar('\n');
}
inline void dijkstra()
{
	__gnu_pbds::priority_queue<pair<int,int>,greater<pair<int,int> >,pairing_heap_tag> q;
	dis[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty())
	{
		pair<int,int> k=q.top();
		q.pop();
		if(vis[k.second]) continue;
		vis[k.second]=1;
		dis[k.second]=k.first;
		for(vector<edge>::iterator i=v[k.second].begin();i!=v[k.second].end();i++)
		{
			q.push(make_pair(i->w+k.first,i->node));
		}
	}
}
int main()
{
	long long ans(0);
	n=read(),m=read();
	for(int i(1);i<=m;i++)
	{
		register int x,y,w;
		x=read(),y=read(),w=read();
		v[x].push_back(edge(y,w));
		v[y+n].push_back(edge(x+n,w)); 
	}
	dijkstra();
	for(int i(2);i<=n;i++)
	{
		ans+=dis[i];
	}
	s=n+1;
	dijkstra();
	for(int i(n+2);i<=(n<<1);i++)
	{
		ans+=dis[i];
	}
	write(ans);
	return 0;
} 

重谢大佬(Orz

2022/5/21 19:43
加载中...