社区讨论
87分 错了#3 #11 wa求助
P3627[APIO2009] 抢掠计划参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo84yhwh
- 此快照首次捕获于
- 2023/10/27 12:51 2 年前
- 此快照最后确认于
- 2023/10/27 12:51 2 年前
CPP
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
unordered_map<string,int>cou;
const int N =5010000, M=8e6+10;
int n,m;
int h[N], e[M], ne[M], idx,hs[N];
int dfn[N],low[N],timestamp;
int stk[N],top;
bool in_stk[N];
int id[N],scc_cnt;
int din[N],dout[N];
int w[N];
int minn[N],sum[N],minid[N];
bool vis[N];
void add(int h[],int a, int b) // 添加一条边a->b
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void add(int h[],int a, int b,int c) // 添加一条边a->b
{
e[idx] = b, w[idx]=c,ne[idx] = h[a], h[a] = idx ++ ;
}
bool st[N];
void tarjan(int u){
dfn[u]=low[u]=++timestamp;
stk[++top]=u,in_stk[u]=true;
for (int i = h[u]; ~i ; i =ne[i] ){
int j=e[i];
if(!dfn[j]){
tarjan(j);
low[u]=min(low[u],low[j]);
}else if(in_stk[j]) {
low[u]=min(low[u],dfn[j]);
}
}
if(dfn[u]==low[u]){
++scc_cnt;
int y;
do{
y=stk[top--];
in_stk[y]=false;
id[y]=scc_cnt;
minn[scc_cnt]+=w[y];
}while(y!=u);
}
}
int dis[N];
void spfa(int s)
{
for(int i=1;i<=n;i++) dis[i]=0;
queue<int>q;
s=id[s];
q.push(s);
vis[s]=true;
dis[s]=minn[s];
while(!q.empty())
{
int h=q.front();q.pop();
vis[h]=false;
for(int i=hs[h];i;i=ne[i])
{
int t=e[i];
if(dis[t]<dis[h]+e[i])
{
dis[t]=dis[h]+w[i];
if(!vis[t])
{
q.push(t);
vis[t]=true;
}
}
}
}
}
int main()
{
cin>>n>>m;
memset(h, -1, sizeof h);
memset(w,0x3f,sizeof w);
int x,y;
for (int i = 1; i <= m; i ++ ){
cin>>x>>y;
if(x!=y)
add(h,x,y);
}
for(int i=1;i<=n;i++){
cin>>w[i];
}
int s,p;
cin>>s>>p;
for (int i = 1; i <= n; i ++ )//tarjan 遍历所有点 所以是2*n
if(!dfn[i])//能买才以这个起点找这个环
tarjan(i);//因此没有dfn的就是不能买的点
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=h[i];~j;j=ne[j]){
int k=e[j];
int a=id[i],b=id[k];
if(a!=b){
din[b]++;
dout[a]++;
add(hs,a,b,minn[b]);
}
}
}
spfa(s);
int res=0;
for(int i=1;i<=p;i++){
cin>>x;
res=max(res,dis[id[x]]);
}
cout << res;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...