学习第一天

今天数学学了不定方程。
为什么呢?因为我们班的数学巨神告诉我,自招喜欢考不定方程,所以就看了看,然后就发现了NOIP2017D1T1的原型(就是那个面值的那个题)。
然后,物理看了基尔霍夫定律、电路叠加原理、等效电源(戴维南定理和诺尔顿定理)。
最后信息学复习了一下最短路。
做了两道很简单的题。

第一道:租用游艇

很水了,直接dijkstra算法即可。

#include
#include
#include
using namespace std;
int n;
int mapp[205][205];
int d[205];
int vis[205];
void dijkstra(){
    d[0]=0;
    for(int i=0;iint minn=0x3f3f3f3f;
        int x;
        for(int j=0;jif(vis[j]==0&&d[j]1;
        for(int j=x+1;jint main(){
    scanf("%d",&n);
    memset(mapp,-1,sizeof(mapp));
    memset(d,0x3f,sizeof(d));
    memset(vis,0,sizeof(vis)); 
    for(int i=0;ifor(int j=i+1;jscanf("%d",&mapp[i][j]);
        }
    }
    dijkstra();
    printf("%d",d[n-1]);
    return 0;
}

第二道:最短路

其实,这道题出得并不严谨,它并没有说会不会有负边权,但是按照数据应该是没有的。
所以直接用log转化为加法即可。

#include
#include
#include
#include
using namespace std;
const int MOD=9987;
int n,m;
double mapp[1005][1005];
int dis[1005][1005];
double d[1005];
int vis[1005];
void dijkstra(){
    d[1]=0.0;
    for(int k=0;kint x;
        double minn=2000000000.0;
        for(int i=1;i<=n;i++){
            if(vis[i]==0&&d[i]1;
        for(int i=1;i<=n;i++){
            if(mapp[x][i]>0){
                if(d[i]>(d[x]+mapp[x][i])){
                    d[i]=d[x]+mapp[x][i];
                }
            }
        }
    }
}
int getAns(int cur){
    if(cur==1){
        return 1;
    }
    for(int i=1;i<=n;i++){
        if(mapp[i][cur]>0&&d[cur]==(d[i]+mapp[i][cur])){
            return (getAns(i)*dis[i][cur])%MOD;
        }
    }
}
int main(){
    memset(mapp,0,sizeof(mapp));
    memset(dis,-1,sizeof(dis));
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        d[i]=2000000000.0;
    }
    for(int i=0;iint u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        mapp[u][v]=log(w);
        dis[u][v]=w;
    }
    dijkstra();
    printf("%d",getAns(n));
    return 0;
}

只是复习,就不做难题了。
这就是我的第一天。

你可能感兴趣的:(北京大学暑期课堂信息科学,学习笔记,最短路,dijkstra,租用游艇,基尔霍夫定律)