zoukankan      html  css  js  c++  java
  • 【[Ynoi2015]我回来了】

    人生第一道ynoi题,感觉大家是不是被ynoi的标签吓到了啊= =,此题的难度个人觉得不到黑题。

    正文部分

    (bitset)+类似一个(dp)的东西乱搞。
    定义(f[u][x])的含义是从第(u)号点开始所有路径长度不超过(x)的集合,这个东西显然我们是可以用(bitset)去维护的。
    接着我们考虑在这个(f)数组上动一些手脚
    对于任何一个(f[i][j]),其(f[i][dis[j]][j]=1)
    这个东西是固定的,为什么?因为是最短路,到达了这个路径的最后一步一定是这个点,于是必定为(1)
    继续考虑转移(f[i][j])
    不难发现:(f[i][j]=f[i][j]|f[i][j-1])

    其中(j)表示的是一个距离,为什么可以这样转移?因为对于任何一个(dis),其(dis-1)包含了(dis-2),(dis-2)包含了(dis-3)...,于是我们可以大胆的直接或上就行了。

    至于最短路,因为权值都相等,所以直接可以写(1)(bfs)这里省略。我不会告诉你我dij都写完了才发现了logn的大常数。

    My Code:

    #include <bits/stdc++.h>
    #define il inline
    #define gc getchar
    #define pc putchar
    #define pb push_back
    const int MAXN = 1010;
    const int GINF = 1001;
    using namespace std;
    namespace IO {
        il int read() {
            int res = 0;char c;bool sign = 0;
            for(c = gc();!isdigit(c);c = gc()) sign |= c == '-';
            for(;isdigit(c);c = gc()) res = (res << 1) + (res << 3) + (c ^ 48);
            return sign ? -res : res;
        }
        il void write(int x) {
            if(x < 0) x = -x,pc('-');
            int stk[20];stk[0] = 0;
            for(;x;x /= 10) stk[++stk[0]] = x % 10;
            for(int i = stk[0];i >= 1;i--) pc(stk[i] + 48);
            return;
        }
        il void writeln(int x) {
            write(x);pc('
    ');
        }
    }
    using IO::read;using IO::write;using IO::writeln;
    int n,m,i,j,k,q,_i;
    bitset<MAXN> f[MAXN][MAXN];
    int dis[MAXN];vector<int>g[MAXN];
    il void readdEdge(int u,int v) {
        g[u].pb(v);g[v].pb(u);
    }
    il void bfs(int S) {
        int i;
        for(i = 1;i <= n;i++) dis[i] = GINF;dis[S] = 0;
        queue<int>Q;Q.push(S);
        while(!Q.empty()) {
            int u = Q.front();Q.pop();
            for(i = 0;i < g[u].size();i++) {
                int to = g[u][i];
                if(dis[u] + 1 < dis[to]) {
                    dis[to] = dis[u] + 1;
                    Q.push(to);
                }
            }
        }
    //	cout << endl << S;
    //	for(i = 1;i <= n;i++) cout << dis[i] << ' ';
    //	cout << endl;
        return;
    } 
    
    int main() {
        n = read();m = read();q = read();
        for(i = 1;i <= m;i++) {
            int u = read(),v = read();
            readdEdge(u,v);
        }	
        for(i = 1;i <= n;i++) {
            bfs(i);
            for(j = 1;j <= n;j++) f[i][dis[j]].set(j);
            for(j = 1;j <= n;j++) f[i][j] |= f[i][j - 1];
        }
        for(_i = 1;_i <= q;_i++) {
            int T = read(),_j;bitset<MAXN> res;
            for(_j = 1;_j <= T;_j++) {
                int x = read(),y = read();
                res |= f[x][y];
            }
            writeln(res.count());
        }
        return 0;
    }
    
    
  • 相关阅读:
    Net EF框架+ MySql示例
    Net EF框架+ MySql示例
    C#中读写INI配置文件
    C#中读写INI配置文件
    C#中读写INI配置文件
    IntelliJ IDEA 常用快捷键和设置
    IntelliJ IDEA 常用快捷键和设置
    C++STL_max
    出错啦!
    枝晶生长的宏微观模型
  • 原文地址:https://www.cnblogs.com/Sai0511/p/10360584.html
Copyright © 2011-2022 走看看