2022/5/3
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022/5/3相关的知识,希望对你有一定的参考价值。
P1550 [USACO08OCT]Watering Hole G
最小生成树的思维题。类似引入一个超级源点,但本体图中本就有n+1个点,要去思考多出来那个点的意义。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod =1e9+7;
struct node
int x,y,w;
e[100005];
int n,w[305],cnt,p,ans,f[305],mi=0x3f;
void add(int i,int j,int ww)
e[++cnt].x=i;
e[cnt].y=j;
e[cnt].w=ww;
bool cmp(node e1,node e2)
return e1.w<e2.w;
int r_find(int r)
if(r==f[r])
return f[r];
f[r]=r_find(f[r]);
return f[r];
int main()
cin>>n;
for(int i=1;i<=n;i++)
cin>>w[i];
add(n+1,i,w[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
int x;cin>>x;
if(j<=i) continue;
add(i,j,x);
sort(e+1,e+cnt+1,cmp);
for(int i=1;i<=n+1;i++)
f[i]=i;
for(int i=1;i<=cnt;i++)
int fx=r_find(e[i].x),fy=r_find(e[i].y);
if(fx==fy)
continue;
f[fx]=fy;
p++;
ans+=e[i].w;
if(p==n) break;
cout<<ans<<endl;
return 0;
P1137 旅行计划
拓扑排序+简单dp city[v]=max(city[v],city[k]+1)
经过的点入读及时减1.
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,m,indgr[maxn],city[maxn],head[maxn],cnt;
struct node
int to,nxt;
g[maxn];
queue<int>q;
void add_edge(int u,int v)
g[++cnt].to=v;
g[cnt].nxt=head[u];
head[u]=cnt;
void topsort()
for(int i=1;i<=n;i++)
if(indgr[i]==0)
city[i]=1;q.push(i);
while(!q.empty())
int k=q.front(); //取得入度为0的结点
q.pop();
for(int i=head[k];i;i=g[i].nxt) //i表示与邻接点相连的变
int v=g[i].to; //通过这个点找到的下一个点
indgr[v]--; //入度减去1
city[v]=max(city[v],city[k]+1); //dp思想
if(indgr[v]==0) //若为0加入队列
q.push(v);
int main()
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
head[i]=-1;city[i]=1;
for(int i=1;i<=m;i++)
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
indgr[b]++;
topsort();
for(int i=1;i<=n;i++)
cout<<city[i]<<endl;
return 0;
以上是关于2022/5/3的主要内容,如果未能解决你的问题,请参考以下文章