zoukankan      html  css  js  c++  java
  • UVALive 6467 Strahler Order


    >
    题目链接

    题意:给定一个有向图,顶点代表水池,入度为零的定点代表水源,等级是1,他们延河道(有向边)冲撞,对于普通的水池来说,题目给定判断它等级的两个准则,问出度为零的那个点的等级是多少。



    是一道拓扑排序,每次寻找入度为零的点入队,直到队列为空。

    出现的问题:

    1. 当时想的主要思路是对的,但是有一点搞错了,就是对于顶点等级的计算方式,顶点的等级应该是在接受了该顶点所有的入度后再进行计算,否则会出现 1 + 1 + 2 = 3 的 情况。 换句话说就是,考虑的情况不够多,没有考虑到对于一个点,所有的入度方式.

    2. 邻接矩阵的使用问题 , 邻接矩阵一般使用于两点之间只有一条边的情况,在其他情况下使用前,先看明白题意,两点之间是否会出现多条边的情况


    code:
    
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<deque>
    #include<map>
    #include<iostream>
    using namespace std;
    typedef long long  LL;
    const double pi=acos(-1.0);
    const double e=exp(1);
    const int N = 100009;
    
    int con[1009][1009];
    int step[1009][1009];
    
    int check[1009];
    int ans[1009];
    
    queue<int> qq;
    
    bool cmp(int a,int b)
    {
        return a>b;
    }
    
    int main()
    {
        int i,j,n,t;
        int a,b,head,k,m,p;
        int spot;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d",&k,&m,&p);
            memset(check,0,sizeof(check));
            memset(con,0,sizeof(con));
            memset(ans,0,sizeof(ans));
    
            memset(step,0,sizeof(step));
    
            spot = 0;
    
            while(!qq.empty())
                qq.pop();
    
            for(i=1; i<=p; i++)
            {
                scanf("%d%d",&a,&b);
                con[a][b] ++;
                check[b]++;
            }
    
            for(i =1; i<=m; i++)
            {
                if(check[i] == 0)
                {
                    ans[i] = 1;
                    qq.push(i);
                    check[i] = -1;
                    spot++;
                }
            }
    
    
            while(!qq.empty())
            {
                head = qq.front();
                qq.pop();
                for(i = 1; i <= m; i++)
                {
                    while(con[head][i])
                    {
                        check[i]--;
                        con[head][i]--;
    
                        step[i][0]++;
                        step[i][step[i][0]] = ans[head];
    
    
                        if(check[i]==0)
                        {
                            qq.push(i);
                            check[i] = -1;
    
                            sort(step[i]+1,step[i]+step[i][0]+1,cmp);
    
                            if(step[i][1] > step[i][2])
                            {
                                ans[i] = step[i][1];
                            }
                            else if(step[i][1] == step[i][2])
                            {
                                ans[i] = step[i][1]+1;
                            }
                        }
    
                    }
                }
            }
    
    
            for(i=1; i<m; i++)
                if(ans[m] < ans[i])
                    ans[m] = ans[i];
    
            printf("%d %d
    ",k,ans[m]);
        }
        return 0;
    }
    
    
    
  • 相关阅读:
    《入门经典》——8.4
    《A First Course in Probability》-chaper7-期望的性质-期望的性质-协方差
    计算几何讲义——计算几何中的欧拉定理
    Gym
    hdu6053
    ACdream1032(树形DP)
    hdu6040
    hdu6035(树形DP)
    hdu6038
    Codeforces #425 Div2 D
  • 原文地址:https://www.cnblogs.com/daybreaking/p/10517020.html
Copyright © 2011-2022 走看看