[模拟赛]提高2019-03-19
......
45+36+30=111(好不吉利的数字)
鬼知道我做第一题的时候在想什么...懒得写
第二题也很水啊...
不过前几天刚有一道类似的题然后改了一点点就交了(其实完全是错的...不过思路确实差不多,不会的看这里吧,贴个代码不详细讲了)
#pragma GCC optimize(3) #pragma GCC optimize("Ofast") #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; inline int read(){ char chr=getchar(); int f=1,ans=0; while(!isdigit(chr)) {if(chr=='-') f=-1;chr=getchar();} while(isdigit(chr)) {ans=(ans<<3)+(ans<<1);ans+=chr-'0';chr=getchar();} return ans*f; }void write(int x){ if(x>9) write(x/10),putchar(x%10+'0'); else putchar(x+'0'); }int n,m,d[505][505],cnt[505][505],f[505][505],now[505]; #define F for(register int k(1);k<=n;++k)for(register int i(1);i<=n;++i)for(register int j(1);j<=n;++j) signed main(){//freopen("path.in","r",stdin);freopen("path.out","w",stdout); n=read(),m=read(); memset(d,0x3f,sizeof d);for(register int i(0);i<=n;++i) d[i][i]=0; for(register int i(1),x,y;i<=m;++i)x=read(),y=read(),d[x][y]=d[y][x]=read(); memcpy(f,d,sizeof d); F if(f[i][j]>f[i][k]+f[k][j]) f[i][j]=f[i][k]+f[k][j]; for(register int i(1);i<=n;++i){ for(register int j(1);j<=n;++j) now[j]=0; for(register int j(1);j<=n;++j) for(register int k(1);k<=n;++k) if(k!=j&&f[i][j]+d[j][k]==f[i][k]) ++now[k]; for(register int j(1);j<=n;++j) for(register int k(1);k<=n;++k) if(f[i][j]+f[j][k]==f[i][k]) cnt[i][k]+=now[j]; } for(register int i(1);i<n;++i) for(register int j(i+1);j<=n;++j) if(f[i][j]==0x3f3f3f3f) putchar('0'),putchar(' ');else write(cnt[i][j]),putchar(' '); return 0; }
第三题...
代码可以很短...似乎确实也只用到了并查集,但确实有点难想,并且...我调了整整一节晚自习课(1.333个小时)...
至于题解戳这里吧...