[模拟赛]提高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个小时)...

至于题解戳这里吧...

 

posted @ 2019-03-20 22:14  zheng_liwen  阅读(140)  评论(0编辑  收藏  举报
/*去广告*/