hoj 13788 Dwarves

//首先判环我都不会 dfs实在写的戳 后来测了好多数据发现dfs写错了 唉 其次不会哈希啊 这个哈希还是dalao手写给我的 珍惜!!!#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <string>
#include <string.h>
#include <queue>
#include <math.h>
#include <map>
#define ULL unsigned long long
using namespace std;
const int maxn=10010;
const int INF=0x3f3f3f3f;
#define mod 10007
int cnt;
vector <int> e[10010];

//map<ULL,int> mp;
int f[10010];
int de[maxn];
int tot;
bool flag=true;
void dfs(int now){
    f[now]=-1;
    for(int i=0;i<e[now].size();i++)
    {
        if(f[e[now][i]]==-1) {flag=false;}
        else if(f[e[now][i]]==0) dfs(e[now][i]);
    }
    f[now]=1;
}

const int maxbuf = 11111;
struct node {
    ULL key;
    int id,next;
}buf[maxbuf];
int h[maxn];
ULL fuck(char a[30]){
    ULL ha=0;
    for(int i=0;a[i];i++){
        ha*=52;
        ha+=a[i];
    }
    return (ha);
}
void inithash() {
    tot = 0;
    memset(h,-1,sizeof(h));
}
int ins(ULL key) {
    int now = ++tot;
    buf[now].key = key, buf[now].id = now, buf[now].next = h[key%mod];
    h[key%mod] = now;
    return now;
}
int fnd(ULL key) {
    for (int i=h[key%mod];~i;i=buf[i].next) {
        if (buf[i].key == key) return buf[i].id;
    }
    return 0;
}

char s1[30],s2[30];
int main(){
    #ifdef shuaishuai
    freopen("C:\\Users\\hasee\\Desktop\\trianglen=100000.in","r",stdin);
    // freopen("C:\\Users\\hasee\\Desktop\\b.txt","w",stdout);
    // freopen("C:\\Users\\hasee\\Desktop\\picture.in","r",stdin);
#endif
   // ios::sync_with_stdio(false);
    char s;
    int n;
        memset(f,0,sizeof f);
        memset(de,0,sizeof de);
        inithash();
    while(scanf("%d\n",&n)!=EOF)
    {
        cnt=1;

        for(int i=0;i<n;i++)
        {
           // cout<<"@"<<endl;
            scanf("%s %c %s\n",s1,&s,s2);
//            cout<<s1<<" "<<s<<" "<<s2<<endl;

            ULL x1=fuck(s1);
            ULL x2=fuck(s2);
            int u = fnd(x1), v = fnd(x2);

//            cout<<"before  "<<u<<" "<<v<<" "<<tot<<endl;
//            cout<<x1<<" "<<x2<<endl;
            if (!u) u = ins(x1);
            if (!v) v = ins(x2);
//            printf("%s %d %s %d\n",s1,u,s2,v);
//            cout<<u<<" "<<v<<" "<<tot<<endl;
           // printf("%d %d\n",x1,x2);
 //           int x1=mp[t1],x2=mp[t2];
//            if(x1==0)x1=mp[t1]=cnt++;
//            if(x2==0)x2=mp[t2]=cnt++;
            if(s==‘>‘)
            {
              e[u].push_back(v);
              de[v]++;
            }
            else
            {
               e[v].push_back(u);
               de[u]++;
            }
        }
        for(int i=1;i<=tot;i++  ){
            if(f[i]==0) dfs(i);
            if(!flag) break;
        }
        if(flag)
             printf("possible\n");
        else
             printf("impossible\n");
             for(int i=0;i<=tot;i++)e[i].clear(),f[i]=0,h[i]=-1,de[i]=0;
             tot=0;
    }
    return 0;
}
时间: 2024-10-27 07:54:18

hoj 13788 Dwarves的相关文章

HOJ 1797 Red and Black

传送门  http://acm.hit.edu.cn/hoj/problem/view?id=1797 总体的思路是遍历可以到达的' . ',将其对应的vis数组化为1,然后统计所有为1的vis项; ①常用的加边法,防止越界 ②初始化,不然两次相同的输入得到的结果会不同,由于是二维数组,能力有限,只好在结尾初始化,为下次输入做准备 ③结束条件,递归函数一定要先写好结束条件,不然会炸 ④上下左右四向移动 ⑤直接递归函数调用自身 1 #include <stdio.h> 2 #include &l

hoj 2662 状态压缩dp

题意: 给定mxn的棋盘,要往其中放d枚棋子,其中,一枚棋子的上下左右四个位置不能再放棋子.求所有合法的放置状态 ( 0<m,n<=80 , mxn<=80 ) 棋盘位置可多达80,爆搜目测超时,我用的状态压缩dp. 棋盘中的一个格子,放棋用1,不放用0 压缩其中一维,每个状态数用一个二进制数表示. 每个状态都是棋盘一行的放置方法 假设,m >= n , 这个递推棋盘就有 m行 ,每行至多有 2^n-1个状态数.其实,没有这么多!按照题意,每个1的上下左右不能有1.对于一行,只知左

HOJ 1001, 1002: A+B, A+B+C

两道水题,用来熟悉 HOJ 的提交系统.1002 需要考虑溢出.直接贴出代码: #include <iostream> using namespace std; int main() { int a, b; while (cin >> a >> b) { cout << (a + b) << endl; } return 0; } #include <iostream> using namespace std; int main()

hoj 经理的烦恼

简单树状数组: 模板,, 题目大意,给定N个商店,有初始商品数量.有两种指令,0 x y 表示x位置的商店的商品数量增加y 1 x y 表示查询[x,y]区间内的商品数量为素数的商店的数目.. 这里更新的条件就变成去判断更新值是否从非素数变成素数或是从素数变成非素数.. 然后对树状数组进行更新.. #include<stdio.h> #include<string.h> #include<iostream> using namespace std; int tree[1

【hoj】1013just the facts

首先,这个题是要求出给定数字的阶乘结果的倒数第一个不为0 的尾数,这需要我们通过阶乘的性质归纳总结出一定的规律,其次,由于题目要求的数字较大,对于高精度的数据可以适当采用java来求解 原文链接http://blog.csdn.net/rappy/article/details/1903360 首先对数列 d [10] = {1, 1, 2, 3, 4, 1, 6, 7, 8, 9} 和 ff [10] = {1, 1, 2, 6, 4, 4, 4, 8, 4, 6} 有 d [0] * ...

【hoj】1031 背包问题

题目:http://acm.hit.edu.cn/hoj/problem/view?id=1031 刚学完算法,但是一直都只停留在ppt以及伪代码层次,都没有实际的编过程序,所以一遇到这个题就傻了,用了贪心,但是有些情况求得的不是最优解,用动态规划才能考虑到所有情况找到最优解 #include <iostream> #include <cstdio> #define MAX 510 #define MAXH 10010 using namespace std; int min(in

【hoj】2608 assemble 二分法

/* 思路:本文要求找到满足预算的最好配置的组件,组装计算机,所以可以是按照 *计算机的quantity以标准去查找相应的组件,就可以应用二分法,将每一种组件中的类型都按照质量排序 *选择满足整体质量的要求的情况下的最低价格 */ #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<cstdio> #include<cstri

HOJ 2275 Number sequence(树状数组)

题意:给定一个n个元素的数列,令Ai, Aj, Ak,使得 Ai < Aj > Ak 且 i < j < k这样的三个数为一组.求出一共有多少组. 思路:可以用树状数组,每次输入一个Ai,可以查询到之前输入的比它小或比它大的有多少组,之后输入的就不得而知了,所以可以开个数组记录下来逆序再建树一次即可 另外数的范围取到了0,所以每个数要自加一次,而且组数是longlong的,而且HOJ的服务器系统支持的是lld,不是i64d..wa了几次 #include<cstdio>

【hoj】1604 cable master

简单,二分法,但是在oj上交的时候会有精度的限制,所以只能把数扩得大一点,而且在扩的时候为防止尾数会自动生成一些非零数,所以还是自己吧扩到的位置设置为0,还有输出时因为%.2lf会自己有4设5入,所以可以自己算出小数点后两位的数值,在输出,保证要求的精度 #include <iostream> #include <stdio.h> #include <algorithm> #define MAX 10010 using namespace std; long long