求助 #8 #10 TLE 84pts
查看原帖
求助 #8 #10 TLE 84pts
398746
ReeChee楼主2022/7/13 21:45

RT

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const ll MAXN=2e4+3,INF=1000000000ll;
int n,m,s,tot,cnt[MAXN],head[MAXN];
ll dist[MAXN],f[MAXN];
bool flag[MAXN];
struct Edge{
    int next,to,w;
}g[MAXN];
inline int read(){
	int now=0,nev=1; char c=getchar();
	while(c<'0' || c>'9') { if(c=='-') nev=-1; c=getchar();}
	while(c>='0' && c<='9') { now=(now<<1)+(now<<3)+(c&15); c=getchar(); }
	return now*nev;
}
inline void write(ll x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
void add(int u,int v,int w){
    g[tot].to=v;
    g[tot].w=w;
    g[tot].next=head[u];
    head[u]=tot++;
    return ;
}
void dijkstra(int x){
    priority_queue<PII,vector<PII>,greater<PII>> q;
    while(!q.empty()) q.pop();
    for (int i=1;i<=n;i++) f[i]=INF;
    memset(flag,0,sizeof(flag));
    f[x]=0;
    q.push({0,x});
    while(!q.empty()){
        PII t=q.top();q.pop();
        int dis=t.first,id=t.second;
        if (flag[dis]) continue;
        for (int i=head[id];i!=-1;i=g[i].next){
            int j=g[i].to;
            if (f[j]>g[i].w+dis){
                f[j]=g[i].w+dis;
                q.push({f[j],j});
            }
        }
    }
    return ;
}
bool spfa(int x){
    memset(flag,0,sizeof(flag));
    queue<int> q;
    while(!q.empty()) q.pop();
    for (int i=1;i<=n;i++) dist[i]=INF;
    flag[x]=true;
    q.push(x);
    dist[x]=0;
    while(!q.empty()){
        int t=q.front();q.pop();
        flag[t]=false;
        for (int i=head[t];i!=-1;i=g[i].next){
            int j=g[i].to;
            if (dist[j]>dist[t]+g[i].w){
                dist[j]=dist[t]+g[i].w;
                cnt[j]=cnt[t]+1;
                if (cnt[j]>=n+1) return true;
                if (!flag[j]){
                    q.push(j);
                    flag[j]=true;
                }
            }
        }
    }
    return false;
}
int main(){
    memset(head,-1,sizeof(head));
    n=read();m=read();
    for (int i=0;i<m;i++){
        int a,b,c;
        a=read();b=read();c=read();
        add(a,b,c);
    }
    for (int i=1;i<=n;i++)
        add(0,i,0); //超级源点
    if (spfa(0)){
        printf("-1");
        return 0;
    }
    for (int i=1;i<=n;i++)
        for (int j=head[i];j!=-1;j=g[j].next)
            g[j].w+=dist[i]-dist[g[j].to];
    for (int i=1;i<=n;i++){
        ll ans=0;
        dijkstra(i);
        for (int j=1;j<=n;j++){
            if (f[j]==INF)
                ans+=j*INF;
            else
                ans+=j*(f[j]+dist[j]-dist[i]);
        }
        write(ans);puts("");
    }
    return 0;
}
2022/7/13 21:45
加载中...