T1:[NOI2002] 银河英雄传说
一道见过很多次的题,就是带权并查集,本题所求的不止是两个东西之间是否有关系,还要求两个东西之间有什么关系,即权重。
size[i]
表示第 i 条队列有多少艘飞船,d[i]
表示iii号飞船的前面有多少艘飞船
看起来没什么毛病不是吗>>>BUT有一个问题:我一开始不理解为什么“等价”的写法为啥就会错,改过来确确实实就AC了,但动动脑子想一想就发现中间改了f[x]的值,并且下一行 就会用到。还有就是记得过程量清零
#include<bits/stdc++.h>
using namespace std;
int t,f[1000010],size[1000010],d[1000010];
int find(int x)
{
if(f[x]==x) return x;
int root=find(f[x]);
d[x]+=d[f[x]];
return f[x]=root;
}
int main()
{
std::ios::sync_with_stdio(0);
cin>>t;
for(int i=1;i<=1e5;i++)
{
f[i]=i;
size[i]=1;
}
while(t--)
{
char k;
int x,y;
cin>>k>>x>>y;
int u=find(x),v=find(y);
if(k=='M')
{
f[u]=v;
d[u]=size[v];
size[v]+=size[u];
size[u]=0;
}
else
{
if(u!=v) cout<<-1<<endl;
else cout<<abs(d[x]-d[y])-1<<endl;
}
}
return 0;
}
T2:[NOIP2003 提高组] 神经网络
我一直觉得图论题相当神奇,不管是这道题还是各种道路的题,我总是感觉自己做过。
可以确定是拓扑排序,搜出一个入度为 0 的点,推出该点并删除其所有边,一直循环直至图空了或者找不到入度为 0 的点(有环)拓扑排序通常用来“排序”具有依赖关系的任务。
但坑很多:①价值存在负值 ②只输出正值 ③大于0而非大于等于0
#include<bits/stdc++.h>
using namespace std;
int n,p,c[10010],u[10010],head[10010],last[10010];
int top,st[10010],ru[10010],chu[10010],num;
struct edge
{
int next,to,w;
} e[10010];
inline void add_edge(int from,int to,int w)
{
e[++num].next=head[from];
e[num].to=to;
e[num].w=w;
head[from]=num;
}
int main()
{
cin>>n>>p;
for(int i=1; i<=n; i++)
{
cin>>c[i]>>u[i];
if(c[i]>0) st[++top]=i;
}
for(int i=1; i<=p; i++)
{
int from,to,w;
cin>>from>>to>>w;
add_edge(from,to,w);
ru[to]++;
chu[from]++;
}
while(top>0)
{
int x=st[top--];
for(int i=head[x]; i; i=e[i].next)
{
ru[e[i].to]--;
if(c[x]>0) c[e[i].to]+=e[i].w*c[x];
if(ru[e[i].to]==0)
{
st[++top]=e[i].to;
c[e[i].to]-=u[e[i].to];
}
}
}
bool flag=0;
for(int i=1; i<=n; i++)
if(chu[i]==0&&c[i]>0)
{
cout<<i<<' '<<c[i]<<endl;
flag=true;
}
if(!flag) cout<<"NULL"<<endl;
return 0;
}
T3:[yLOI2018] 扶苏的问题
线段树板子,但是真的太长了QwQ迭代最大值的时候 -1e6 居然不够