[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; }