ACM-ICPC实验室20.2.21测试-图论(二)
2024-10-08 11:40:55
A.患者的编号
给出一个有向图,要求你输出字典序最小的拓扑排序。
常规拓扑排序是做不了的,正解是反向建图,同时用大根堆的优先队列维护,保证每次优先访问编号大的结点,再反向输出~
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
vector<int> g[maxn];
vector<int> topOrder;
int inDegree[maxn];
int N,M,x,y;
void topSort () {
priority_queue<int> q;
for (int i=;i<=N;i++)
if (inDegree[i]==) q.push(i);
while (!q.empty()) {
int u=q.top();
q.pop();
topOrder.push_back(u);
for (int i=;i<g[u].size();i++) {
int v=g[u][i];
if (--inDegree[v]==)
q.push(v);
}
}
}
int num[maxn];
int main () {
while(~scanf("%d %d",&N,&M)) {
fill(inDegree,inDegree+maxn,);
topOrder.clear();
for (int i=;i<maxn;i++) g[i].clear();
for (int i=;i<M;i++) {
scanf("%d %d",&x,&y);
g[y].push_back(x);
inDegree[x]++;
}
topSort();
for (int i=;i<topOrder.size();i++) {
num[topOrder[i]]=N-i;
}
for (int i=;i<=N;i++) {
if (i!=) printf (" ");
printf ("%d",num[i]);
}
printf ("\n");
}
return ;
}
D.传送门
特殊的,点的权值也可以作为最小生成树的边,建树时贪心操作即可~
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
const ll inf=1e18;
ll g[maxn][maxn];
ll w[maxn];
int visit[maxn];
ll d[maxn];
ll c[maxn];
int N;
ll prim (int s) {
fill (d,d+maxn,inf);
fill (visit,visit+maxn,);
d[s]=w[s];
ll ans=;
for (int i=;i<=N;i++) {
int u=-;ll mmin=inf;
for (int j=;j<=N;j++)
if (!visit[j]&&d[j]<mmin) {
u=j;
mmin=d[j];
}
if (u==-) return -;
visit[u]=;
ans+=d[u];
//printf ("%d\n",d[u]);
for (int v=;v<=N;v++)
if (!visit[v]&&v!=u) d[v]=min(w[v],min(d[v],g[u][v]));
}
return ans;
}
struct node {
int x,y;
}Node[maxn];
int main () {
scanf("%d",&N);
for (int i=;i<=N;i++)
for (int j=;j<=N;j++) g[i][j]=inf;
for (int i=;i<=N;i++) scanf("%d %d",&Node[i].x,&Node[i].y);
for (int i=;i<=N;i++) scanf("%lld",&w[i]);
for (int i=;i<=N;i++) scanf("%lld",&c[i]);
for (int i=;i<=N;i++) {
for (int j=i+;j<=N;j++) {
ll dis=(c[i]+c[j])*(abs(Node[i].x-Node[j].x)+abs(Node[i].y-Node[j].y));
//printf ("%lld\n",dis);
g[i][j]=g[j][i]=dis;
}
}
int u=-;
ll mmin=inf;
for (int i=;i<=N;i++) {
if (w[i]<mmin) {
mmin=w[i];u=i;
}
}
ll ans=prim(u);
printf ("%lld\n",ans);
return ;
}
最新文章
- HTML中&;nbsp; &;ensp; &;emsp; &;thinsp;等6种空白空格的区别
- css知多少(1)——我来问你来答
- 【leetcode】Text Justification(hard) ☆
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
- WWF3控制流程类型活动<;第二篇>;
- Debugging JTAG Connectivity Problems
- sae的kvdb使用注意
- poj 3273 Monthly Expense (二分搜索,最小化最大值)
- java中的四则运算
- Ubuntu 用 pptp 建立 vpn 服务
- dwExStyle和dwStyle的说明(Delphi SDK窗口)
- IT只忍者龟Photoshop简单人像的头发抠图过程
- 我看过得最易懂的一段AOP的解释
- RobotFramework自动化测试框架-使用Python编写自定义的RobotFramework Lib
- Echart ,X轴显示的为tooltip内显示的一部分内容放在上面显示的一部分如下图所示
- centos7 (ifconfig不能使用) -bash: ifconfig: command not found
- aspnet-api-versioning
- <;Android 基础(三十二)>; ViewFlipper
- firefox chrome ie9,10,11 不支持selectSingleNode和selectNodes的解决方法
- linux管道命令学习(一)
热门文章
- Piggy-Bank HDU - 1114 完全背包
- AcWing 10. 有依赖的背包问题
- window snmp
- spring boot no identifier specified for entity
- Unity3D制作3D虚拟漫游场景(二)
- 55.ORM外键:引用同app下的不同模型,引用不同app下的模型,引用模型自身使用详解
- Java注释&;标识符
- C++-POJ2975-Nim
- Codeforces Round #603 (Div. 2) C.Everyone is A Winner!
- java基础之 修饰符