求查错,,qaq
查看原帖
求查错,,qaq
286881
yy2111楼主2020/6/12 17:16
#include<bits/stdc++.h>
using namespace std;
#define INF 1e9
int he[3005],n,k,m,t[3005];
long long h[3005],ds[3005];
bool v[3005];
struct ys{
	int dis,to,nxt;
}aa[10005];
void add(int a,int b,int c){
	aa[++k].nxt=h[a];
	aa[k].dis=c;
	aa[k].to=b;
	he[a]=k;
	//cout<<a<<" "<<k<<endl;
}
bool spfa(int s){
	queue<int>q;
	memset(h,0x3f,sizeof(h));
	h[s]=0;v[s]=1;
	q.push(s);
	while(q.size()){
		int u=q.front();q.pop();
		v[u]=0;
		//cout<<he[u]<<endl;
		for(int i=he[u];i;i=aa[i].nxt){
			int vv=aa[i].to;
			if(h[vv]>h[u]+aa[i].dis){
				h[vv]=h[u]+aa[i].dis;
				if(!v[vv]){
					q.push(vv);
					v[vv]=1;
					t[vv]++;
					//cout<<vv<<" "<<t[vv]<<endl;
					if(t[vv]==n)return false;
				}
			}
		}
	}
	return true;
}
void dijkstra(int x){
	priority_queue<pair<int,int> >q;
	memset(v,0,sizeof(v));
	for(int i=1;i<=n;i++){
		ds[i]=INF;
	}
	ds[x]=0;
	q.push(make_pair(0,x));
	while(q.size()){
		int u=q.top().second;q.pop();
		if(v[u])continue;
		v[u]=1;
		for(int i=he[u];i;i=aa[i].nxt){
			int vv=aa[i].to;
			if(ds[vv]>ds[u]+aa[i].dis){
				ds[vv]=ds[u]+aa[i].dis;
				q.push(make_pair(-ds[vv],vv));
			}
		}
	}
	
}
int main(){
    ios::sync_with_stdio(false);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,c);
		//add(0,i,0);
	}
	for(int i=1;i<=n;i++)add(0,i,0);
	if(!spfa(0)){
		cout<<"-1"<<endl;
		return 0;
	}
	h[1]=0;
	for(int u=1;u<=n;u++){
		for(int i=he[u];i;i=aa[i].nxt){
		    //cout<<u<<" "<<aa[i].dis<<" ";
			aa[i].dis+=h[u]-h[aa[i].to];
			//cout<<h[u]<<" "<<h[aa[i].to]<<" "<<aa[i].dis<<endl;
		}
	}
	for(int i=1;i<=n;i++){
		dijkstra(i);
		long long ans=0;
		for(int j=1;j<=n;j++){
		    //cout<<i<<" "<<j<<" "<<ds[j]<<" ";
			if(ds[j]==INF){ans+=j*INF;continue;}
			//if(i==j)continue;
			ans+=j*(ds[j]+h[j]-h[i]);
			//cout<<ans<<endl;
		}
		//return 0;
		printf("%lld\n",ans);
	}
	return 0;
}
2020/6/12 17:16
加载中...