分层图 #贪心 #POI #Year2010
考虑将答案的图建成一个 \(5\) 层的图,其中 \(1,2\) 为第 \(1,5\) 层,第 \(2,4\) 层为已经与 \(1,2\) 相连的点
考虑将剩下的点与第 \(2,4\) 层相连,贪心选尽可能大的
// Author: xiaruize
const int N = 2e5 + 10;
int n, m;
vector<int> g[N];
int cnt1, cnt2, cnt3;
int vis[N];
int res = 0;
void solve()
{
cin >> n >> m;
rep(i, 1, m)
{
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for (auto v : g[1])
{
cnt1++;
vis[v] = 1;
}
for (auto v : g[2])
{
vis[v] = 2;
cnt2++;
}
cnt3 = n - cnt1 - cnt2 - 2;
res = (cnt3 - 1) * cnt3 / 2 + cnt2 * (cnt2 - 1) / 2 + cnt1 * (cnt1 - 1) / 2;
rep(x, 1, n)
{
if (!vis[x])
{
int tot = 0;
int flag = 0;
for (auto v : g[x])
{
if (vis[v])
{
tot++;
flag = vis[v];
}
else if (v > x)
res--;
}
if (flag == 1)
res += cnt1 - tot;
else if (flag == 2)
res += cnt2 - tot;
else
res += max(cnt1, cnt2);
}
else
{
for (auto v : g[x])
if (vis[v] && v > x)
res--;
}
}
cout << res << endl;
}
#ifndef ONLINE_JUDGE
bool end_of_memory_use;
#endif
signed main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int testcase = 1;
// cin >> testcase;
while (testcase--)
solve();
#ifndef ONLINE_JUDGE
cerr << "Memory use:" << (&end_of_memory_use - &start_of_memory_use) / 1024.0 / 1024.0 << "MiB" << endl;
cerr << "Time use:" << (double)clock() / CLOCKS_PER_SEC * 1000.0 << "ms" << endl;
#endif
return 0;
}
标签:int,res,Teleportation,vis,POI2010TEL,cnt3,cnt2,cnt1
From: https://www.cnblogs.com/xiaruize/p/18142214