TLE3点,码风精简
查看原帖
TLE3点,码风精简
768325
Herbie_ZHB楼主2024/12/28 09:31
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3010,M=6010;
#define mk make_pair
#define pii pair<int,int>
int n,m;
int tot,head[N],nxt[M],to[M],cnt[N],inf;
bool vis[N],inq[N];
int dis[N],val[M],h[N];
void add(int u,int v,int w){
	tot++;nxt[tot]=head[u];to[tot]=v;head[u]=tot;val[tot]=w;
}
bool spfa(int st){
	for(int i=0;i<=n;i++){
		h[i]=1e9;
	}
	h[st]=0;
    inq[st]=1;
    cnt[st]=1;
    queue<int> q; 
    q.push(st);
    while(!q.empty()){
        int u=q.front();q.pop();
        inq[u]=0;
        for(int i=head[u];i;i=nxt[i]){
        	int v=to[i],w=val[i];
        	if((ll)(h[u]+w)<h[v]){
        		h[v]=h[u]+w;
        		if(!inq[v]){
        			q.push(v);
        			inq[v]=1;
        			cnt[v]++;
        			if(cnt[v]==n+1){
        				return 0;
        			}
        		}
        	}
        }
    }
    return 1;
}
void Dijkstra(int st){
//	memset(dis,0x7f,sizeof(dis));
//	inf=dis[st];
	for(int i=1;i<=n;i++)dis[i]=1e9,vis[i]=0;
	dis[st]=0;
	priority_queue< pii,vector<pii>,greater<pii> > q;
	q.push(mk(0,st));
	while(!q.empty()){
		int u=q.top().second;q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=head[u];i;i=nxt[i]){
			int v=to[i],w=val[i];
			if((ll)(dis[u]+w)<dis[v]){
				dis[v]=dis[u]+w;
				if(vis[v]==0)q.push(mk(dis[v],v));
			}
		}
	}
} 
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	for(int i=1;i<=n;i++)add(0,i,0);
	if(!spfa(0)){//因为是有向图,防止从i点spfa但不能到全部点. 
		printf("-1\n");
		return 0;
	}
	for(int u=1;u<=n;u++){
		for(int i=head[u];i;i=nxt[i]){
			int v=to[i];
			val[i]=h[u]-h[v]+val[i];
		}	
	}
	for(int i=1;i<=n;i++){
		Dijkstra(i);
	    ll ans=0;
		for(ll j=1;j<=n;j++){
			if(i==j)continue;
			if(dis[j]==1e9){
				ans+=j*1e9;
			}else{
				ans+=j*(dis[j]-h[i]+h[j]);
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
2024/12/28 09:31
加载中...