#8TLE求调
查看原帖
#8TLE求调
970277
trkmbl楼主2024/12/13 16:17
#include<iostream>
#include<vector>
#include<queue>
#define int long long
using namespace std;
struct node
{
	int pos,v;
	node(int a,int b):pos(a),v(b){}
};
struct cmp
{
	bool operator() (const node& a,const node& b){return a.v>b.v;}
};
vector<vector<node> > mp;
deque<int> q;
vector<int> ifdist;
vector<int> dist;
vector<int> h;
priority_queue<node,vector<node>,cmp> pq;
long long sum=0;
int n,m;
main()
{
	ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	cin>>n>>m;
	mp.resize(n+1);
	ifdist.resize(n+1,0);
	dist.resize(n+1,(int)1e9);
	h.resize(n+1,(int)1e9);
	for(int i=1;i<=n;i++)
	{
		mp[0].emplace_back(node(i,0));
	}
	while(m--)
	{
		int a,b,c;
		cin>>a>>b>>c;
		mp[a].emplace_back(node(b,c));
	}
	q.push_back(0);
	ifdist[0]++;
	h[0]=0;
	//spfa
	while(!q.empty())
	{
		int x=q.front();q.pop_front();
		for(vector<node>::iterator it=mp[x].begin();it!=mp[x].end();it++)
		{
			if(h[x]+it->v<h[it->pos])
			{
				h[it->pos]=h[x]+it->v;
				ifdist[it->pos]++;
				if(ifdist[it->pos]>=n)
				{
					cout<<-1;
					return 0;
				}
				if(!q.empty()&&h[it->pos]<h[q.front()])//SLF
				q.push_front(it->pos);
				else
				q.push_back(it->pos);
			}
		}
	}
	//w(u,v)->w(u,v)+dist[u]-dist[v]
	for(int i=1;i<=n;i++)
		for(vector<node>::iterator it=mp[i].begin();it!=mp[i].end();it++)
			it->v=it->v+h[i]-h[it->pos];
	//n遍dij
	for(int kkk=1;kkk<=n;kkk++)
	{
		sum=0;
		dist.assign(n+1,(int)1e9);
		ifdist.assign(n+1,0);
		dist[kkk]=0;
		ifdist[kkk]=1;
		pq.push(node(kkk,0));
		while(!pq.empty())
		{
			int x=pq.top().pos;pq.pop();
			for(vector<node>::iterator it=mp[x].begin();it!=mp[x].end();it++)
			{
				if(dist[x]+it->v<dist[it->pos])
				{
				dist[it->pos]=dist[x]+it->v;
				pq.push(node(it->pos,dist[it->pos]));
				}
			}
		}
		for(int i=1;i<=n;i++)
		{
			if(dist[i]==(int)1e9) sum+=i*(int)1e9;
			else sum +=i*(dist[i]+h[i]-h[kkk]);
		}
		cout<<sum<<"\n";
	} 
}

#8TLE 求调

2024/12/13 16:17
加载中...