zoukankan      html  css  js  c++  java
  • 拓扑排序/DFS HDOJ 4324 Triangle LOVE

    题目传送门

    题意:判三角恋(三元环)。如果A喜欢B,那么B一定不喜欢A,任意两人一定有关系连接

    分析:正解应该是拓扑排序判环,如果有环,一定是三元环,证明。 DFS:从任意一点开始搜索,搜索过的点标记,否则超时。看是否存在两点路程只差等于2,如果存在,则说明有上述的三角环。其他做法

    收获:DFS搜索一定要用vis数组啊,否则很容易超时的

    代码(拓扑排序):

    /************************************************
    * Author        :Running_Time
    * Created Time  :2015-8-25 19:24:24
    * File Name     :E_topo.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int N = 2e3 + 10;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    char s[N][N];
    vector<int> G[N];
    int in[N];
    int n;
    
    bool Topo_Sort(void)    {
        memset (in, 0, sizeof (in));
        for (int i=1; i<=n; ++i)    {
            for (int j=0; j<G[i].size (); ++j)  in[G[i][j]]++;
        }
        queue<int> Q;   int cnt = 0;
        for (int i=1; i<=n; ++i)    if (!in[i]) Q.push (i);
        while (!Q.empty ()) {
            int u = Q.front (); Q.pop ();
            cnt++;
            for (int i=0; i<G[u].size (); ++i)    {
                int v = G[u][i];
                if (!(--in[v])) Q.push (v);
            }
        }
        if (cnt == n)   return false;
        else    return true;
    }
    
    int main(void)    {
    	int T, cas = 0;	scanf ("%d", &T);
    	while (T--)	{
    		scanf ("%d", &n);
    		for (int i=1; i<=n; ++i)    G[i].clear ();
            for (int i=1; i<=n; ++i)	{
    			scanf ("%s", s[i] + 1);
                for (int j=1; j<=n; ++j)    {
                    if (s[i][j] == '1') G[i].push_back (j);
                }
    		}
    
    		printf ("Case #%d: %s
    ", ++cas, (Topo_Sort () ? "Yes" : "No"));
    	}
    
        return 0;
    }

    代码(DFS):

    /************************************************
    * Author        :Running_Time
    * Created Time  :2015-8-25 9:44:18
    * File Name     :E.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int N = 2e3 + 10;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    char s[N][N];
    bool vis[N];
    int d[N];
    int n;
    
    bool DFS(int u)	{
        for (int i=1; i<=n; ++i)    {
            if (s[u][i] == '1') {
                if (vis[i] && d[u] == d[i] + 2) return true;
                else if (!vis[i])   {
                    vis[i] = true;  d[i] = d[u] + 1;
                    if (DFS (i))    return true;
                }
            }
        }
        return false;
    }
    
    int main(void)    {
    	int T, cas = 0;	scanf ("%d", &T);
    	while (T--)	{
    		scanf ("%d", &n);
    		memset (vis, false, sizeof (vis));
    		memset (d, 0, sizeof (d));
            for (int i=1; i<=n; ++i)	{
    			scanf ("%s", s[i] + 1);
    		}
    
            vis[1] = true;
    		printf ("Case #%d: %s
    ", ++cas, (DFS (1) ? "Yes" : "No"));
    	}
    
        return 0;
    }
    
    编译人生,运行世界!
  • 相关阅读:
    Partition HDU
    FFT版题 [51 Nod 1028] 大数乘法
    [51Nod 1220]
    [bzoj 4176] Lucas的数论 (杜教筛 + 莫比乌斯反演)
    [51Nod 1222]
    [51Nod 1227] 平均最小公倍数 (杜教筛)
    算法-05-二分查找第一个出现的数 美团一面
    Hbase-00-MAC 安装Hbase 单机模式
    算法-04-用两个栈实现队列
    算法-03-Java 实现阻塞队列 字节三面算法题
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4758500.html
Copyright © 2011-2022 走看看