2014年一码中特
首頁 > 其他 > 詳細

洛谷 P2661 信息傳遞

時間:2019-05-02 15:50:39      閱讀:13      評論:0      收藏:0      [點我收藏+]

標簽:mark   只需要   queue   stdin   namespace   沒有   mar   ace   include   

圖論入門題

首先分析一下題目。不妨把圖畫出來:

技術分享圖片

可以看到,2,3,4由于在一個環中,三輪游戲過后,他們都會拿到自己的信息。

于是乎,題目實際上要求我們求圖中的最小環

因為我們只需要在環上的點。所以不妨先刪除所有不在環上的點,具體做法就是刪除入度為0的點和他的出邊,如果他連到的點,在他刪除后,那個點的入度也為0了,就把那個點和其出邊也刪除(見代碼)。類似于拓撲排序。

最后求出每個環的長度即可。具體見代碼:

#include<bits/stdc++.h>
using namespace std;
int n,t[200010],ans=2000000,r[200010],mark[200010];
queue<int> q;
void dfs(int start,int now,int l){//start表示從那個點開始,now表示現在在哪,l記錄環的長度
    if(now==start && l!=0){//繞了一圈回來了
        ans=min(l,ans);
        return ;
    }
    if(mark[t[now]]==0){
        mark[t[now]]=-1;
        dfs(start,t[now],l+1); 
    }
}
void clean(int i){
    r[t[i]]--;
    mark[i]=-1;
    if(r[t[i]]==0 && mark[t[i]]==0){
        clean(t[i]);
    }
}
int main(){
    freopen("1.in","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&t[i]); 
        r[t[i]]++;//計算每個點的入度 
    }
    for(int i=1;i<=n;i++){
        if(r[i]==0 && mark[i]==0){
            clean(i);
        }
    }
    for(int i=1;i<=n;i++){
        if(mark[i]==0){//如果一個點所在的環沒有被遍歷過 
            dfs(i,i,0);
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

洛谷 P2661 信息傳遞

標簽:mark   只需要   queue   stdin   namespace   沒有   mar   ace   include   

原文:https://www.cnblogs.com/Laehcim/p/10802443.html

(0)
(0)
   
舉報
評論 一句話評論(0
0條  
登錄后才能評論!
? 2014 bubuko.com 版權所有 魯ICP備09046678號-4
打開技術之扣,分享程序人生!
             

魯公網安備 37021202000002號

2014年一码中特 一天赚一百的技巧 pk10直播开奖赛车链接 北京福彩pk10走势图 快三提前开奖漏洞 双色球专家杀号定胆 重庆时时彩2.1版本安卓 大小单双哪个平台最正规 分分彩免费计划软件 中奖计算器 票GG天津时时