這道題看著就是尤拉路徑的題目:度數為奇數點的個數是0或者2。但是又要考慮顏色間的聯通性,比如兩根棍子:(blue, blue), (red, red)。這種情況就是impossible.
看了discuss,解法也大同小異。基本就是用trie統計每種顏色的個數(即節點度數)。同時用並查集(union-find)檢測連通性:最後只能有一棵樹。trie也基本都是靜態預先分配的。開到500000以後應該就夠,這裡保險起見用的550000。
thestoryofsnow
2513
accepted
59068k
891ms
c++
/*
id: thestor1
lang: c++
task: poj2513
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int maxc = 11;
const int maxn = 550000;
int trie[maxn][26], tsize = 1;
int t2d[maxn];
int degree[maxn], dsize = 1;
int parent[maxn];
int insert(char color, int root)
degree[t2d[root]]++;
return t2d[root];
} int next = *color - 'a';
if (trie[root][next] == 0)
return insert(color + 1, trie[root][next]);
}int find(int x)
return x;
}void union_set(int lhs, int rhs)
int main()
} int count = 0;
bool inconnected = false;
for (int i = 1; i < dsize; ++i)
}} if (inconnected)
else
}if (oddcnt != 0 && oddcnt != 2)
else
}return 0;
}
poj 2513(字典樹 尤拉通路)
題意 給你n個火柴棍,每個火柴棍頭和尾兩種顏色,問你是否存在能夠把這些火柴棍擺成一行的情況,兩個相連的火柴棍的顏色需要一樣 解題思路 最初的思路是用map標記顏色,然後把每種顏色看作點,每根火柴棍看作邊,求尤拉路徑,然後超時了。看了別人的寫法,想起來了自己還學過字典樹來著。然後用字典樹找就行了,快很...
poj解題報告 1328
不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...
poj解題報告 2586
這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...