class Node:
def __init__(self):
self.father = []
self.child = []
self.dis = -99999999
s = set()
n = int(input())
d = {}
for i in range(n):
c,f = input().split()
if c not in d:
d[c] = Node()
if f not in d:
d[f] = Node()
d[c].father.append(f)
d[f].child.append(c)
start,target = input().split()
d[start].dis = 0
p = [start]
keep = True
while keep:
for i in p:
for j in d[i].father:
if j not in s:
s.add(j)
d[j].dis = d[i].dis-1
p.append(j)
if j == target:
keep = False
break
for j in d[i].child:
if j not in s:
s.add(j)
d[j].dis = d[i].dis+1
p.append(j)
if j == target:
keep = False
break
if keep == False: break
print(d[target].dis)2024年1月9日 星期二
k862. 輩份比較
假設B,C是A的祖先,D,E是A的子孫,F是E的子孫,如果我們先忽略輩分這件事情,單純從A點走到F,那就是一個單純的BFS就可以解決的事情,只要在BFS的基礎上,讓每個節點記錄自己的父輩與子孫輩的成員即可。
2024年1月8日 星期一
m702. 傑出校友票選活動
題目要比對各個人名出現的次數,因為人名是字串,不方便直接用陣列做排序與索引,所以可以先放到map裡面去計次,記完之後再放回vector裡做排序即可。
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
int main()
{
cin.tie(0) , cin.sync_with_stdio(0);
int n,m;
cin >> n >> m;
map<string , int> t;
for(int i = 0; i < n; i++) {
string s;
cin >> s;
t[s] += 1;
}
vector<pair<int , string>> v;
for(auto it=t.begin(); it != t.end(); it++) {
pair<int,string> p;
p.first = it->second;
p.second = it->first;
v.push_back(p);
}
sort(v.begin() , v.end());
for(int i = 0; i < m; i++) {
cout << v[v.size()-1-i].second << " ";
}
cout << endl;
return 0;
}
訂閱:
文章 (Atom)
o079. 4. 最佳選擇
題目描述: 給一個長度為 n 的正整數序列 a1,a2...an ,你可以執行多次操作 (包含 0 次),每次操作只能選擇這個序列的第一個或最後一個數字,再將這個數字從序列中刪除並自己搜集起來。 求滿足總和不超過 k 且搜集的數字奇數和偶數個數相同的條件下,所能搜集的數字總和最...
-
要計算最小合併成本,就需要用到DP,DP的精髓就是分而治之,假設今天只有3個資料要合併,-1,3,-5,那麼情形不外乎是(-1,(3,-5) ) 或是 ((-1, 3),-5),從兩個之中找最小成本。如果這時候再增加一個資料如-1,3,-5,6那麼情形就是((-1...
-
題目描述: 給一個長度為 n 的正整數序列 a1,a2...an ,你可以執行多次操作 (包含 0 次),每次操作只能選擇這個序列的第一個或最後一個數字,再將這個數字從序列中刪除並自己搜集起來。 求滿足總和不超過 k 且搜集的數字奇數和偶數個數相同的條件下,所能搜集的數字總和最...
-
乍看之下,本來覺得可以直接硬解,所以沒多想便用了很多清單來解題,沒想到過程中發現要記錄的資訊量很大,寫著寫著程式越來越複雜,所幸從頭開始,運用自訂結構,將每個節點所需要的欄位明確定義出來,這題就會簡單許多。 解題技巧運用到BFS再加上一些條件式判斷...