নির্দেশিত গ্রাফে চক্র সনাক্ত করার জন্য সেরা অ্যালগরিদম


395

নির্দেশিত গ্রাফের মধ্যে সমস্ত চক্র সনাক্ত করার জন্য সবচেয়ে কার্যকর অ্যালগরিদম কী?

আমার একটি পরিচালিত গ্রাফ রয়েছে যার একটি কর্মসূচির প্রতিনিধিত্ব করে যা সম্পাদন করা দরকার, একটি চাকরী নোড এবং নির্ভরতা একটি প্রান্ত হতে পারে। আমাকে এই গ্রাফের মধ্যে একটি চক্রের ত্রুটির ঘটনাটি সনাক্ত করতে হবে যা ঘূর্ণি নির্ভরতা নির্ভর করে।


13
আপনি বলছেন যে আপনি সমস্ত চক্র সনাক্ত করতে চান, তবে আপনার ব্যবহারের ক্ষেত্রে পরামর্শ দেয় যে কোনও চক্র রয়েছে কিনা তা সনাক্ত করা যথেষ্ট be
স্টিভ জেসোপ

29
সমস্ত চক্র সনাক্ত করা আরও ভাল হবে যাতে চেক, ফিক্স, চেক, ফিক্স ইত্যাদির চেয়ে
এগুলি একযোগে

2
আপনার ডোনাল্ড বি জনসনের "নির্দেশিত গ্রাফের সমস্ত প্রাথমিক সার্কিট সন্ধান করা" পত্রিকাটি পড়া উচিত। এটি কেবলমাত্র প্রাথমিক সার্কিটগুলি খুঁজে পাবে, তবে এটি আপনার ক্ষেত্রে যথেষ্ট হবে। এবং এখানে আমার জাভা প্রয়োগের জন্য প্রস্তুত এই অ্যালগরিদমটি প্রস্তুত: github.com/1123/johnson
user152468

অ্যালগরিদমের জন্য অতিরিক্ত সংশোধন করে ডিএফএস চালান: আপনি যে নোডটি দেখেছেন সেটিকে চিহ্নিত করুন। আপনি যদি ইতিমধ্যে পরিদর্শন করা কোনও নোডে যান, তবে আপনার কাছে একটি সাইকেল রয়েছে। আপনি যখন কোনও পথ থেকে পশ্চাদপসরণ করেন, পরিদর্শন করা নোডগুলি চিহ্ন চিহ্ন করুন mark
হেশাম ইয়াসিন

2
@ হেশাম ইয়াসিন, আপনি যদি ইতিমধ্যে পরিদর্শন করা কোনও নোড দেখতে যান তবে এর অর্থ এই নয় যে কোনও লুপ আছে। অনুগ্রহ করে আমার মন্তব্য পড়ুন cs.stackexchange.com/questions/9676/…
মাকসিম দিমিত্রিভ

উত্তর:


193

Tarjan এর দৃঢ়ভাবে সংযুক্ত উপাদান অ্যালগরিদম হয়েছে O(|E| + |V|)সময় জটিলতা।

অন্যান্য অ্যালগরিদমের জন্য, উইকিপিডিয়ায় দৃ connected়ভাবে সংযুক্ত উপাদানগুলি দেখুন ।


69
দৃ the়ভাবে সংযুক্ত উপাদানগুলি কীভাবে আপনাকে গ্রাফে বিদ্যমান চক্র সম্পর্কে বলতে পারে?
পিটার

4
কেউ হতে পারে তা নিশ্চিত হতে পারে তবে টারজান অ্যালগরিদম এ-> এ এর ​​মতো সরাসরি নিজের দিকে নির্দেশ করে নোডের চক্র সমর্থন করে না।
সিড্রিক গেইলমেট

24
@ সিড্রিক ঠিক আছে, সরাসরি নয়। এটি টার্জনের অ্যালগরিদমের কোনও ত্রুটি নয়, তবে এটি এই প্রশ্নের জন্য যেভাবে ব্যবহৃত হয়। টারজন সরাসরি চক্রটি খুঁজে পায় না , এটি দৃ strongly়ভাবে সংযুক্ত উপাদানগুলি আবিষ্কার করে। অবশ্যই, 1 এর চেয়ে বেশি আকারের কোনও এসসিসি একটি চক্রকে বোঝায়। নন-সাইক্লিক উপাদানগুলি নিজেরাই সিঙ্গলটন এসসিসি থাকে। সমস্যাটি হ'ল একটি স্ব-লুপ নিজে থেকে একটি এসসিসিতেও যাবে। সুতরাং স্ব-লুপগুলির জন্য আপনার একটি পৃথক চেক প্রয়োজন, যা বেশ তুচ্ছ।
mgiuca

13
(গ্রাফের সমস্ত
দৃ strongly়ভাবে

4
@ আকু: একটি তিন রঙের ডিএফএসেরও একই রানটাইম রয়েছে O(|E| + |V|)। সাদা (কখনও দেখা হয়নি), ধূসর (বর্তমান নোড পরিদর্শন করা হয়েছে তবে সমস্ত পৌঁছনযোগ্য নোড এখনও পরিদর্শন করা হয়নি) এবং কালো (সমস্ত পৌঁছনযোগ্য নোডগুলি বর্তমানের সাথে দেখা হয়) রঙ কোডিং, যদি ধূসর নোড অন্য ধূসর নোড খুঁজে পায় তবে আমরা ' একটি চক্র। [করমেনের অ্যালগরিদম বইতে আমরা যা কিছু করেছি তা খুব সুন্দর] ভাবছেন যে 'টার্জনের অ্যালগরিদম' এর কোনও ডিএফএসের কোনও সুবিধা আছে কিনা !!
কেঘাটক

73

এটি কাজের একটি সময়সূচী দেওয়া, আমি সন্দেহ করি যে কোনও সময় আপনি তাদের কার্যকর করার প্রস্তাবিত আদেশে সাজানোর জন্য যাচ্ছেন ।

যদি তা কেস হয়, তবে একটি টপোলজিকাল সাজানোর প্রয়োগটি যে কোনও ক্ষেত্রে চক্র সনাক্ত করতে পারে। ইউনিক্স tsortঅবশ্যই তা করে। আমি মনে করি যে এটি পৃথক পদক্ষেপ না করে বরং একই সাথে চলাচলের জন্য চক্র সনাক্ত করা আরও দক্ষ likely

সুতরাং প্রশ্নটি হয়ে উঠতে পারে, "আমি কীভাবে সবচেয়ে দক্ষতার সাথে লুপগুলি সনাক্ত করতে পারি" তার চেয়ে "আমি কীভাবে সর্বাধিক দক্ষতার সাথে সস্তার করব"। যার উত্তর সম্ভবত "একটি গ্রন্থাগার ব্যবহার করুন", তবে নিম্নলিখিত উইকিপিডিয়া নিবন্ধটি ব্যর্থ হয়েছে:

http://en.wikipedia.org/wiki/Topological_sorting

একটি অ্যালগরিদমের সিউডো কোড এবং টারজন থেকে অন্যটির সংক্ষিপ্ত বিবরণ রয়েছে। দুজনেরই O(|V| + |E|)সময় জটিলতা রয়েছে।


একটি টপোলজিকাল সাজানোর চক্রটি সনাক্ত করতে পারে, যদিও এটি গভীরতা-প্রথম অনুসন্ধানের অ্যালগরিদমের উপর নির্ভর করে তবে আপনাকে চক্র সনাক্ত করতে অতিরিক্ত বুককিপিং প্রয়োজন। কার্ট পিকের সঠিক উত্তর দেখুন।
লুক হাচিসন

33

এটি করার সহজ উপায় হ'ল গ্রাফের গভীরতার প্রথম ট্রভার্সাল (ডিএফটি) করা

যদি nগ্রাফটির শিখাটি থাকে তবে এটি একটি O(n)সময় জটিলতা অ্যালগরিদম। যেহেতু আপনাকে প্রতিটি ভার্টেক্স থেকে শুরু করে সম্ভবত একটি ডিএফটি করতে হবে, মোট জটিলতা হয়ে ওঠে O(n^2)

আপনাকে বর্তমান গভীরতার প্রথম ট্রভারসালগুলিতে সমস্ত সূচিযুক্ত একটি স্ট্যাক বজায় রাখতে হবে , যার প্রথম উপাদানটি মূল নোড। আপনি যদি ডিএফটি চলাকালীন কোনও উপাদান ইতিমধ্যে স্ট্যাকের মধ্যে উপস্থিত হন তবে আপনার একটি চক্র রয়েছে।


21
এটি "নিয়মিত" গ্রাফের জন্য সত্য, তবে নির্দেশিত গ্রাফের পক্ষে এটি মিথ্যা । উদাহরণস্বরূপ, চারটি নোডের সাথে "ডায়মন্ড নির্ভরতা ডায়াগ্রাম" বিবেচনা করুন: A এবং B এবং C এর দিকে নির্দেশিত প্রান্তগুলির প্রত্যেকটি, যার প্রতিটিতে একটি ডি প্রান্ত নির্দেশ করে রয়েছে A থেকে এই চিত্রের আপনার DFT ট্র্যাভারসাল ভুলভাবে উপসংহারে পৌঁছবে যে "লুপ" ছিল আসলে একটি চক্র - যদিও একটি লুপ রয়েছে তবে এটি একটি চক্র নয় কারণ এটি তীরগুলি অনুসরণ করে অতিক্রম করা যায় না।
পিটার

9
@ ইপিটার আপনি কী দয়া করে ব্যাখ্যা করতে পারবেন যে এ থেকে ডিএফটি ভুলভাবে সিদ্ধান্ত নিতে পারে যে একটি চক্র রয়েছে?
দীপক

10
@ প্রদীপ - আসলে, আমি "ফিজিক উইজার্ড" থেকে উত্তরটি ভুলভাবে লিখেছি: যেখানে তিনি লিখেছিলেন "স্ট্যাকটিতে" আমি ভেবেছিলাম "ইতিমধ্যে পাওয়া গেছে"। ডিএফটি কার্যকর করার সময় "স্ট্যাকের মধ্যে" দুপ্পগুলি পরীক্ষা করার জন্য এটি অবশ্যই (নির্দেশিত লুপ সনাক্তকরণের জন্য) যথেষ্ট হবে। আপনার প্রতিটি জন্য একটি upvote।
পিটার

2
আপনি যদি বলেন যে সময় জটিলতা O(n)যখন আপনি স্ট্যাকটি পরীক্ষা করার পরামর্শ দিচ্ছেন যে এটিতে ইতিমধ্যে একটি ভিজিট নোড রয়েছে কিনা তা দেখার জন্য? স্ট্যাকটি স্ক্যান করা O(n)রানটাইমের সময় যোগ করে কারণ এটি প্রতিটি নতুন নোডে স্ট্যাকটি স্ক্যান করতে হয়। আপনি O(n)যদি পরিদর্শন করা নোডগুলি চিহ্নিত করেন তবে আপনি অর্জন করতে পারেন
জেমস ওয়েয়ারজবা

পিটার যেমন বলেছিলেন, এটি নির্দেশিত গ্রাফগুলির জন্য অসম্পূর্ণ। কার্ট পিকের সঠিক উত্তর দেখুন।
লুক হাচিসন

31

কর্পেন এট আল। এর লেমা 22.11 অনুসারে , আলগোরিদিমগুলির পরিচিতি (সিএলআরএস):

একটি নির্দেশিত গ্রাফ জি অ্যাসাইক্লিক এবং যদি কেবলমাত্র জি এর গভীরতা-প্রথম অনুসন্ধানের কোনও পেছনের কিনারা পাওয়া যায় না।

এটি বিভিন্ন উত্তরে উল্লেখ করা হয়েছে; এখানে আমি সিএলআরএস এর 22 অধ্যায়টির উপর ভিত্তি করে একটি কোড উদাহরণও সরবরাহ করব। উদাহরণ গ্রাফ নীচে চিত্রিত হয়।

এখানে চিত্র বর্ণনা লিখুন

গভীরতা-প্রথম অনুসন্ধানের জন্য সিএলআরএসের সিউডো কোডটি পড়ে:

এখানে চিত্র বর্ণনা লিখুন

CLRS চিত্র 22.4 মধ্যে উদাহরণে, গ্রাফ দুটি DFS গাছ নিয়ে গঠিত: এক নোড গঠিত U , V , এক্স , এবং Y নোড অন্যান্য, এবং W এবং জেডের সমন্বিত । প্রতিটি গাছে একটি পিছনের প্রান্ত থাকে: x থেকে v এবং অন্যটি z থেকে z (একটি স্ব-লুপ) থাকে।

মূল উপলব্ধিটি হ'ল পিছনে একটি প্রান্তটি সম্মুখীন হয় যখন, DFS-VISITফাংশনটিতে, যখন প্রতিবেশীদের কাছ vথেকে পুনরাবৃত্তি করা হয় u, GRAYরঙের সাথে একটি নোডের মুখোমুখি হয় ।

নিম্নলিখিত পাইথন কোডটি একটি ifঅনুচ্ছেদের সাথে সিএলআরএসের সিউডোকোডের একটি রূপান্তর যা চক্র সনাক্ত করে:

import collections


class Graph(object):
    def __init__(self, edges):
        self.edges = edges
        self.adj = Graph._build_adjacency_list(edges)

    @staticmethod
    def _build_adjacency_list(edges):
        adj = collections.defaultdict(list)
        for edge in edges:
            adj[edge[0]].append(edge[1])
        return adj


def dfs(G):
    discovered = set()
    finished = set()

    for u in G.adj:
        if u not in discovered and u not in finished:
            discovered, finished = dfs_visit(G, u, discovered, finished)


def dfs_visit(G, u, discovered, finished):
    discovered.add(u)

    for v in G.adj[u]:
        # Detect cycles
        if v in discovered:
            print(f"Cycle detected: found a back edge from {u} to {v}.")

        # Recurse into DFS tree
        if v not in finished:
            dfs_visit(G, v, discovered, finished)

    discovered.remove(u)
    finished.add(u)

    return discovered, finished


if __name__ == "__main__":
    G = Graph([
        ('u', 'v'),
        ('u', 'x'),
        ('v', 'y'),
        ('w', 'y'),
        ('w', 'z'),
        ('x', 'v'),
        ('y', 'x'),
        ('z', 'z')])

    dfs(G)

মনে রাখবেন যে এই উদাহরণে, timeসিএলআরএস-এর সিউডোকোড ক্যাপচার করা হয়নি কারণ আমরা কেবল চক্র সনাক্ত করতে আগ্রহী। প্রান্তের একটি তালিকা থেকে গ্রাফের সংলগ্ন তালিকা উপস্থাপনা তৈরির জন্য কিছু বয়লারপ্লেট কোডও রয়েছে।

এই স্ক্রিপ্টটি কার্যকর করা হলে, এটি নিম্নলিখিত আউটপুট প্রিন্ট করে:

Cycle detected: found a back edge from x to v.
Cycle detected: found a back edge from z to z.

এগুলি সিএলআরএস চিত্র 22.4 এর উদাহরণে ঠিক পিছনের প্রান্তগুলি।


4
এটি এখানে কেবলমাত্র সম্পর্কিত, গ্রহণযোগ্য এবং কার্যকরী উত্তর, আরও অনেক বেশি উত্সাহের দাবি রাখে।
প্লাজম্যাসেল

29

ডিএফএস দিয়ে শুরু করুন: একটি চক্র বিদ্যমান এবং কেবল তখনই ডিএফএসের সময় একটি ব্যাক-এজ আবিষ্কার হয় । এটি সাদা-পথের থিয়োরামের ফলস্বরূপ প্রমাণিত।


3
হ্যাঁ, আমিও একই রকম মনে করি, তবে এটি যথেষ্ট নয়, আমি আমার পথ পোস্ট করলাম cs.stackexchange.com/questions/7216/find-the-simple-cycles-in-a-didedected- অনুগ্রহ করে
জুন

সত্য। অজয় গার্গ কেবল "একটি চক্র" কীভাবে সন্ধান করবেন সে সম্পর্কেই বলছেন যা এই প্রশ্নের একটি অংশের উত্তর। আপনার লিঙ্কটি জিজ্ঞাসা করা প্রশ্ন অনুসারে সমস্ত চক্র সন্ধানের বিষয়ে কথা বলে, তবে আবার দেখে মনে হচ্ছে এটি অজয় ​​গর্গের মতো একই পদ্ধতির ব্যবহার করে তবে সমস্ত সম্ভাব্য ডিএফএস-ট্রিও করে।
মনোহর রেড্ডি পোরেড্ডি

এটি নির্দেশিত গ্রাফগুলির জন্য অসম্পূর্ণ। কার্ট পিকের সঠিক উত্তর দেখুন।
লুক হাচিসন

26

আমার মতে, নির্দেশিত গ্রাফের চক্র সনাক্তকরণের জন্য সর্বাধিক বোধগম্য অ্যালগরিদম হ'ল গ্রাফ-বর্ণ-অ্যালগরিদম।

মূলত, গ্রাফ কালারিং অ্যালগরিদম গ্রাফটি ডিএফএস পদ্ধতিতে চলেছে (ডিপথ ফার্স্ট সন্ধান, যার অর্থ এটি অন্য কোনও পথ অন্বেষণের আগে পুরোপুরি কোনও পথ অন্বেষণ করে)। এটি পিছনের প্রান্তটি খুঁজে পেলে এটি গ্রাফটিকে লুপযুক্ত হিসাবে চিহ্নিত করে।

গ্রাফের রঙিন অ্যালগরিদমের গভীরতার জন্য, অনুগ্রহ করে এই নিবন্ধটি পড়ুন: http://www.geeksforgeeks.org/detect- यकल-direct-راف-used-colors /

এছাড়াও, আমি জাভাস্ক্রিপ্ট https://github.com/dexcodeinc/ographic_algorithm.js/blob/master/ographic_algorithm.js এ গ্রাফ বর্ণের একটি বাস্তবায়ন সরবরাহ করি


8

আপনি যদি নোডগুলিতে একটি "পরিদর্শন করা" সম্পত্তি যুক্ত করতে না পারেন তবে একটি সেট (বা মানচিত্র) ব্যবহার করুন এবং ইতিমধ্যে সেটে না থাকলে সমস্ত সেটিং নোড সেটে সেট করুন add "কী" হিসাবে একটি অনন্য কী বা অবজেক্টগুলির ঠিকানা ব্যবহার করুন।

এটি আপনাকে চক্রীয় নির্ভরতার "রুট" নোড সম্পর্কেও তথ্য দেয় যা ব্যবহারকারীর যখন সমস্যাটি সমাধান করতে হবে তখন কার্যকর হবে।

আরেকটি সমাধান হ'ল কার্যকর করার জন্য পরবর্তী নির্ভরতা সন্ধান করার চেষ্টা করা। এর জন্য আপনার কিছু স্ট্যাক থাকা আবশ্যক যেখানে আপনি এখন কোথায় আছেন এবং আপনাকে পরবর্তী কী করা উচিত তা মনে রাখতে পারে। আপনি এটি কার্যকর করার আগে এই স্ট্যাকের উপর নির্ভরশীলতা ইতিমধ্যে রয়েছে কিনা তা পরীক্ষা করুন। যদি তা হয় তবে আপনি একটি চক্র খুঁজে পেয়েছেন।

যদিও এটি O (N * M) এর জটিলতা বলে মনে হতে পারে আপনি অবশ্যই মনে রাখতে হবে যে স্ট্যাকের একটি খুব সীমাবদ্ধ গভীরতা রয়েছে (সুতরাং এন ছোট) এবং এম প্রতিটি প্রতি নির্ভরতার সাথে ছোট হয়ে যায় যা আপনি "এক্সিকিউটড" প্লাস হিসাবে চেক করতে পারবেন আপনি যখন কোনও পাতা পেয়েছেন তখন অনুসন্ধান বন্ধ করতে পারেন (যাতে আপনাকে কখনই প্রতিটি নোড চেক করতে হবে না -> এমও ছোট হবে)।

মেটাএমকে, আমি তালিকাগুলির তালিকা হিসাবে গ্রাফ তৈরি করেছি এবং তারপরে প্রতিটি নোড মুছে ফেলি যা এগুলি প্রাকৃতিকভাবে অনুসন্ধানের পরিমাণকে হ্রাস করে। আমাকে আসলে একটি স্বাধীন চেক চালাতে হয়নি, এটি সাধারণ মৃত্যুর সময় স্বয়ংক্রিয়ভাবে ঘটেছিল।

আপনার যদি "কেবলমাত্র পরীক্ষা" মোডের প্রয়োজন হয় তবে কেবল একটি "শুকনো রান" পতাকা যুক্ত করুন যা প্রকৃত কাজের কার্যকর করতে অক্ষম করে।


7

এমন কোনও অ্যালগরিদম নেই যা বহুচরণের সময়ে নির্দেশিত গ্রাফের সমস্ত চক্র খুঁজে পেতে পারে। মনে করুন, নির্দেশিত গ্রাফের নোড রয়েছে এবং নোডের প্রতিটি জোড়ের একে অপরের সাথে সংযোগ রয়েছে যার অর্থ আপনার একটি সম্পূর্ণ গ্রাফ রয়েছে। সুতরাং এই এন নোডগুলির কোনও খালি খালি সাবসেট একটি চক্রকে নির্দেশ করে এবং এই জাতীয় সাবসেটের 2 ^ n-1 সংখ্যা রয়েছে। সুতরাং কোনও বহুপদী সময় অ্যালগরিদম বিদ্যমান নেই। সুতরাং ধরুন আপনার একটি দক্ষ (অ-নির্বোধ) অ্যালগরিদম আছে যা আপনাকে কোনও গ্রাফে নির্দেশিত চক্রের সংখ্যা বলতে পারে, আপনি প্রথমে শক্তিশালী সংযুক্ত উপাদানগুলি খুঁজে পেতে পারেন, তারপরে এই সংযুক্ত উপাদানগুলিতে আপনার অ্যালগরিদম প্রয়োগ করতে পারেন। যেহেতু চক্রগুলি কেবলমাত্র উপাদানগুলির মধ্যে থাকে এবং সেগুলির মধ্যে নয়।


1
সত্য, যদি নোডের সংখ্যাটি ইনপুটটির আকার হিসাবে নেওয়া হয়। আপনি প্রান্ত বা এমনকি চক্রের সংখ্যা বা এই ব্যবস্থার সংমিশ্রণের ক্ষেত্রে রানটাইম জটিলতাও বর্ণনা করতে পারেন। ডোনাল্ড বি জনসন দ্বারা পরিচালিত "নির্দেশিত গ্রাফের সমস্ত প্রাথমিক সার্কিটগুলি সন্ধান করা" অ্যালগরিদমের ও ((এন + ই) (সি + 1)) দ্বারা বহনযোগ্য বহনযোগ্য সময় রয়েছে যেখানে এন নোডের সংখ্যা, এবং প্রান্তের সংখ্যা এবং সি গ্রাফের প্রাথমিক সার্কিটের সংখ্যা। এবং এই আলগোরিদিমটি সম্পর্কে আমার জাভা বাস্তবায়ন: github.com/1123/ জোহসন
ব্যবহারকারী 152468

4

আমি এই সমস্যাটি এসএমএল (অত্যাবশ্যক প্রোগ্রামিং) এ প্রয়োগ করেছিলাম। এখানে রূপরেখা দেওয়া হল। সমস্ত নোড সন্ধান করুন যেগুলির হয় একটি অনাদায়ী বা 0 এর মেয়াদোত্তীর্ণ। এই জাতীয় নোডগুলি একটি চক্রের অংশ হতে পারে না (সুতরাং সেগুলি সরিয়ে ফেলুন)। এর পরে এ জাতীয় নোডগুলি থেকে সমস্ত আগত বা বহির্গামী প্রান্তগুলি সরান। পুনরাবৃত্তভাবে ফলাফল গ্রাফ এ প্রক্রিয়া প্রয়োগ করুন। শেষে যদি আপনার কোনও নোড বা প্রান্ত না থাকে, গ্রাফের কোনও চক্র থাকে না, অন্যথায় এটি থাকে।


2

আমি যেভাবে এটি করি তা হল টপোলজিক্যাল বাছাই করা, পরিদর্শন করা উল্লম্বের সংখ্যা গণনা করা। যদি ডিএজি-তে মোট উল্লম্বের সংখ্যার চেয়ে কম হয় তবে আপনার একটি চক্র রয়েছে।


4
এর কোনো মানে নাই. যদি গ্রাফের চক্র থাকে তবে কোনও টপোলজিকাল বাছাই নেই, যার অর্থ টপোলজিকাল বাছাইয়ের জন্য কোনও সঠিক অ্যালগরিদম বাতিল করা হবে।
সেলসেকে

4
উইকিপিডিয়া থেকে: অনেক টপোলজিকাল বাছাই করা অ্যালগরিদমগুলি চক্রগুলিও সনাক্ত করতে পারে, যেহেতু সেগুলি টপোলজিকাল ক্রমটির অস্তিত্বের জন্য বাধা।
ওলেগ মিখিভ

1
@ ওলেগমিখিভ হ্যাঁ, তবে স্টিভ বলছেন "যদি সেই সংখ্যাটি ডিএজি-তে মোট উল্লম্বের সংখ্যার চেয়ে কম হয় তবে আপনার একটি চক্র রয়েছে", এটি কোনও অর্থ দেয় না।
nbro

@ এনব্রো আমি বাজি রেখেছি, তাদের অর্থ টপোলজিকাল বাছাই অ্যালগরিদমের একটি বৈকল্পিক যা কোনও টপোলজিকাল বাছাইয়ের উপস্থিতি উপস্থিত না হয়ে পরে (এবং তারপরে তারা সমস্ত শীর্ষে ঘুরে দেখেন না)।
মার্টিনাস

আপনি যদি চক্র সহ কোনও গ্রাফিকের টপোলজিকাল বাছাই করেন তবে আপনি এমন একটি অর্ডার দিয়ে শেষ করবেন যাতে কমপক্ষে খারাপ প্রান্ত রয়েছে (অর্ডার নম্বর> প্রতিবেশীর অর্ডার নম্বর)। তবে আপনার চক্রের সাথে একটি গ্রাফ সনাক্তকরণের ফলে এই খারাপ প্রান্তগুলি সনাক্ত করা তার সহজ বাছাই করার পরে
ইউজিপি

2

/mathpro/16393/finding-a-cycle-of-fixed-length यकल-of-fixed- দৈর্ঘ্য আমি এই সমাধানটি 4 দৈর্ঘ্যের জন্য বিশেষত পছন্দ করি :)

এছাড়াও শারীরিক উইজার্ড বলছে আপনাকে ও (ভি ^ 2) করতে হবে। আমি বিশ্বাস করি যে আমাদের কেবল ও (ভি) / ও (ভি + ই) প্রয়োজন। যদি গ্রাফটি সংযুক্ত থাকে তবে ডিএফএস সমস্ত নোডে পরিদর্শন করবে। যদি গ্রাফটি উপ-গ্রাফগুলি সংযুক্ত থাকে তবে প্রতিবার এই উপগ্রাফের একটি শীর্ষে একটি ডিএফএস চালানোর সময় আমরা সংযুক্ত শীর্ষটি আবিষ্কার করব এবং ডিএফএসের পরবর্তী রানের জন্য এগুলি বিবেচনা করতে হবে না। সুতরাং প্রতিটি ভার্টেক্সের জন্য দৌড়ানোর সম্ভাবনাটি ভুল।


1

ডিএফএস যদি ইতিমধ্যে পরিদর্শন করা শীর্ষ প্রান্তকে নির্দেশ করে এমন একটি কিনারা খুঁজে পায় তবে আপনার সেখানে একটি চক্র রয়েছে।


1
1,2,3: 1,2 এ ব্যর্থ; 1,3; 2,3;
গোলমাল বিড়াল

4
@ জেকগ্রিন এখানে দেখুন: i.imgur.com/tEkM5xy.png বোঝার জন্য যথেষ্ট সহজ। আপনাকে 0 থেকে শুরু করে বলুন তারপর আপনি নোড 1 এ যান, সেখান থেকে আর কোনও পাথ নেই, পুনর্বিবেচনা ফিরে যায়। এখন আপনি নোড 2 দেখুন, যার প্রান্ত 1 এর প্রান্ত রয়েছে, যা ইতিমধ্যে পরিদর্শন করা হয়েছিল। আপনার মতে আপনার তখন একটি চক্র থাকবে - এবং আপনার কাছে সত্যিই একটি নেই
গোলমাল বিড়াল

3
@ কিট্টিপিএল এই গ্রাফটিতে একটি চক্র থাকে না। উইকিপিডিয়া থেকে: "একটি নির্দেশিত গ্রাফের একটি নির্দেশিত চক্রটি একই শীর্ষবিন্দুতে সূচনা এবং শেষের অনুক্রমের ক্রম যেমন, চক্রের প্রতিটি পর পর দুটি শীর্ষে, পূর্ববর্তী শীর্ষটি থেকে পরেরটি পর্যন্ত নির্দেশিত একটি প্রান্ত থাকে" আপনি নির্দেশিকা চক্রের জন্য ভি থেকে ফিরে আসা পথ অনুসরণ করতে সক্ষম হতে হবে। মাফোনিয়ার সমাধান প্রদত্ত সমস্যার জন্য কাজ করে
জ্যাক গ্রিন

2
@ জেকগ্রিন অবশ্যই তা করেন না। আপনার অ্যালগরিদম ব্যবহার করে এবং 1 থেকে শুরু করে আপনি যে কোনও ভাবেই একটি চক্র শনাক্ত করতে পারবেন ... এই অ্যালগরিদমটি খুব খারাপ ... সাধারণত যখনই আপনি কোনও পরিদর্শনের ভার্টেক্সের মুখোমুখি হন তখন পিছনের দিকে হাঁটা যথেষ্ট।
গোলমাল বিড়াল

6
@ কিট্টিপিএল ডিএফএস প্রদত্ত শুরুর নোড থেকে চক্র সনাক্ত করতে কাজ করে। কিন্তু ডিএফএস করার সময় আপনাকে অবশ্যই পিছনের দিক থেকে ক্রস-এজকে আলাদা করতে দেখার জন্য নোডগুলি রঙ করতে হবে। প্রথমবার কোনও শীর্ষবিন্দুটি দেখার পরে এটি ধূসর হয়ে যায়, তারপরে সমস্ত প্রান্ত একবার দেখা হয়ে গেলে আপনি এটি কালো করে তোলেন। যদি ডিএফএস করার সময় আপনি ধূসর ভার্টেক্সকে আঘাত করেন তবে সেই প্রান্তটি পূর্বপুরুষ (যেমন: আপনার একটি চক্র রয়েছে)। যদি ভার্টেক্সটি কালো হয় তবে এটি কেবল একটি ক্রস প্রান্ত।
কিরারা

0

যেমনটি আপনি বলেছেন, আপনি চাকরির সেট করেছেন, এটি নির্দিষ্ট ক্রমে কার্যকর করা দরকার। Topological sortআপনাকে কাজের সময় নির্ধারণের জন্য প্রয়োজনীয় আদেশ প্রদান করা হয়েছে (বা নির্ভরতা সমস্যার জন্য এটি যদি হয় direct acyclic graph)। dfsএকটি তালিকা চালান এবং বজায় রাখুন এবং তালিকার শুরুতে নোড যুক্ত করা শুরু করুন এবং যদি আপনি এমন কোনও নোডের মুখোমুখি হন যা ইতিমধ্যে পরিদর্শন করা হয়েছে। তারপরে আপনি প্রদত্ত গ্রাফটিতে একটি চক্র খুঁজে পেয়েছেন।


-11

যদি কোনও গ্রাফ এই সম্পত্তিটিকে সন্তুষ্ট করে

|e| > |v| - 1

তারপরে গ্রাফটিতে অন্তত চক্র থাকে।


10
এটি অপরিবর্তিত গ্রাফগুলির জন্য সত্য হতে পারে, তবে অবশ্যই নির্দেশিত গ্রাফগুলির জন্য নয়।
হ্যান্স-পিটার স্টার

6
একটি পাল্টা উদাহরণ হ'ল এ-> বি, বি-> সি, এ-> সি।
ব্যবহারকারী 152468

সমস্ত ভার্টিকোজের কিনারা নেই।
দেবানজান ধর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.