首页 > 其他分享 >POJ 2513 Colored Sticks

POJ 2513 Colored Sticks

时间:2023-08-07 11:23:50浏览次数:38  
标签:map Sticks idx int ++ POJ include id Colored

\(POJ\) \(2513\) \(Colored\) \(Sticks\)

一、题目描述

一堆木棍左右两端涂有颜色,相同颜色的可以连接在一起,问所有木棍能否都连上

二、解题代码

#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>

// 无法AC,TLE,原因不明白
using namespace std;
const int N = 250010, M = 500010;
char s1[15], s2[15]; // 两个字符串

// 链式前向星
int e[M], h[N], idx, w[M], ne[M];
void add(int a, int b, int c = 0) {
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}

int cnt;
map<string, int> _map;
int id = 1, st[N], d[N];

void dfs(int u) {
    cnt++;     // cnt是数量统计器
    st[u] = 1; // 标识被访问过
    for (int i = h[u]; ~i; i = ne[i]) {
        int v = e[i];
        if (st[v]) continue;
        dfs(v);
    }
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("POJ2513.in", "r", stdin);
#endif
    memset(h, -1, sizeof h);
    int op;
    while (~scanf("%s%s", s1, s2)) {
        int a, b;
        if (!_map[s1]) _map[s1] = id++; // 手动离散化,帅!
        if (!_map[s2]) _map[s2] = id++;
        a = _map[s1], b = _map[s2];
        // 邻接表走起
        add(a, b), add(b, a);
        // 记录度
        d[a]++, d[b]++;
    }
    // 只有1个点
    if (id == 1) {
        puts("Possible");
        return 0;
    }

    dfs(1); // 判断有没有孤立点
    if (cnt != id - 1) {
        puts("Impossible");
        return 0;
    }

    op = 0;
    for (int i = 1; i < id; i++) // 无向图有0个或两个奇度点含有
        if (d[i] % 2) op++;      // 欧拉回路或欧拉通路

    if (op == 0 || op == 2) // 好像有点卡常,交c++冲过去了...
        puts("Possible");
    else
        puts("Impossible");
    return 0;
}

标签:map,Sticks,idx,int,++,POJ,include,id,Colored
From: https://www.cnblogs.com/littlehb/p/17610931.html

相关文章

  • POJ 1041 John's trip
    \(POJ\)\(1041\)\(John's\)\(trip\)一、题目大意多组数据,输入\(x,y,z\),表示结点\(x\)和结点\(y\)之间有一条序号为\(z\)的边,如果这个无向图中存在欧拉回路,就输出字典序最小的欧拉回路,如果不存在欧拉回路就输出Roundtripdoesnotexist.。当输入00表示一组数据输入结束......
  • POJ 3020 Antenna Placement
    \(POJ\)\(3020\)\(Antenna\)\(Placement\)一、题目描述*--代表城市,o--代表空地给城市安装无线网,一个无线网最多可以覆盖两座城市,问覆盖所有城市最少要用多少无线。公式:最小路径覆盖=总节点数-最大匹配数我们要尽可能多的建立能覆盖两个城市的基站(二分匹配最大匹配),剩下的......
  • H - Collecting Bugs POJ-2096
    H-CollectingBugsPOJ-2096期望dp题意根据题意可以将原题意转换成:有个\(n*s\)的矩阵,每次会随机选取一个格子填上颜色,问每行每列都填上颜色的期望次数。思路dp,显然是期望dp,那么设\(dp_{i,j}\)为已经有\(i\)行\(j\)列填上颜色,到目标还需的次数的期望,那么每次......
  • POJ - Buy Tickets
    Smiling&Weeping----你看这个人,嘴里说着喜欢我却又让我这么难过DescriptionRailwayticketsweredifficulttobuyaroundtheLunarNewYearinChina,sowemustgetupearly......
  • POJ 1548 Robots
    \(POJ\)\(1548\)\(Robots\)题意相当于给出\(N\)个坐标点,因为机器人只能向下或者向右走,所以如果能到达其他点,则连接这两个点,即line[i][j]=1最小路径覆盖数:对于一个\(DAG\)(有向无环图),选取最少条路径,使得每个顶点属于且仅属于一条路径。路径长度可以为零;(有向图中找一些路径,使......
  • POJ1904 King's Quest
    \(POJ1904\)\(King's\)\(Quest\)一、题目描述有\(n\)个王子,每个王子都有\(k\)个喜欢的妹子,每个王子只能和喜欢的妹子结婚。现有一个匹配表,将每个王子都与一个自己喜欢的妹子配对。请你根据这个表得出每个王子可以和几个自己喜欢的妹子结婚,按序号升序输出妹子的编号,这个表应满......
  • poj 2886 Who Gets the Most Candies? (线段树单点更新应用)
                           poj2886WhoGetstheMostCandies?DescriptionNchildrenaresittinginacircletoplayagame.Thechildrenarenumberedfrom1toNinclockwiseorder.Eachofthemhasacardwithanon-zerointegeronit......
  • POJ 3694 Network
    POJ3694Network一、题目大意\(n\)个点,\(m\)个边,连通图。点与点之间通过边连接,如果切断某个边使得有点与其他点连接断开(连通分支增加),则称这种边为桥梁(离散上叫割边)。接下来有\(Q\)个操作,每操作一次,也就是切断某条边后,输出当前存在的桥梁数量。二、样例分析我们看这个4......
  • (Relax 数论1.26)POJ 1496 Word Index(计算一个字符串在字典中的位置)
    大致题意:(与POJ1850基本一致)输出某个str字符串在字典中的位置,由于字典是从a=1开始的,因此str的位置值就是在str前面所有字符串的个数+1规定输入的字符串必须是升序排列。不降序列是非法字符串要求用循环输入,输入若干组字符串,若输入非法字符串则输出0,但不结束程序,这是和POJ1850......
  • POJ 1458 Common Subsequence(动态规划)
    传送门代码如下:#include<iostream>#include<cstdio>usingnamespacestd;intmaxLen[1000][1000];intmain(){strings1,s2;while(cin>>s1>>s2){intlength1=s1.length();intlength2=s2.length();......