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\n",k,ans[m]);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章