[JSOI2007]重要的城市(x)

开始(脑残ing)诶?

暴力能过

噼里啪啦码码码

TLE TLE 啥?看错复杂度?带个25的常数 ?*……!%@……*%#…!@#!@#……*!@#&

Floyd,并记录两点间的一个重要的城市。

当出现等距离最短路时说明上该点上次的松弛点 并非唯一

删去否则更新

#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn = 287;
inline int read() {
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
    while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
    return x*f;
}
int n,m,num=0;
int map[maxn][maxn];
int dis[maxn][maxn];
bool vis[maxn];
int main() {
    n=read(),m=read();
    memset(dis,0x3f,sizeof dis);
    for(int a,b,i=1;i<=m;++i) {
        a=read(),b=read();
        dis[a][b]=dis[b][a]=read();
    }
    for(int k=1;k<=n;++k) 
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j) {
                if(i!=j&&j!=k) {
                    if(dis[i][j]>dis[i][k]+dis[k][j]) {
                        dis[i][j]=dis[i][k]+dis[k][j];
                        map[i][j]=k;
                    }
                    else if(dis[i][j]==dis[i][k]+dis[k][j]) map[i][j]=0;
                }
            }
    for(int i=1;i<=n;++i) 
        for(int j=1;j<=n;++j) 
            vis[map[i][j]]=1;    
    for(int i=1;i<=n;++i) if(vis[i]) printf("%d ",i),num++;
    if(!num) puts("No important cities.");
    return 0;
}
原文地址:https://www.cnblogs.com/sssy/p/8612840.html