Summer Holiday

    xiaoxiao2023-11-12  129

    #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAXN=1010; const int MAXM=2010; const int INF=0x3f3f3f3f; struct edge{ int u,v,w; int nxt; }edge[MAXM]; int N,M; int ret; int head[MAXN],tot; int low[MAXN],dfn[MAXN],Stack[MAXN],Belong[MAXN]; int Index,top; int scc; bool Instack[MAXN]; int degin[MAXN],degout[MAXN]; int num[MAXN]; int val[MAXN]; bool flag[MAXN]; void init() { tot=0; memset(head,-1,sizeof(head)); } add(int u,int v,int w) { edge[tot].u=u;edge[tot].v=v;edge[tot].w=w; edge[tot].nxt=head[u];head[u]=tot++; } void tarjian(int u){ int v; dfn[u]=low[u]=++Index; Stack[top++]=u; Instack[u]=true; for (int i=head[u];i!=-1;i=edge[i].nxt){ int v=edge[i].v; if (!dfn[v]) { tarjian(v); if (low[u]>low[v]) low[u]=low[v]; } else if(Instack[v]&&low[u]>dfn[v]) low[u]=dfn[v]; } if (low[u]==dfn[u]) { scc++; do { v=Stack[--top]; Instack[v]=false; Belong[v]=scc; num[scc]++; }while (v!=u); } } void calc(){ memset(dfn,0,sizeof(dfn)); memset(Instack,false,sizeof(Instack)); Index=top=scc=0; int ans=0,ret=0; memset(flag,false,sizeof(flag)); memset(degin,0,sizeof(degin)); memset(degout,0,sizeof(degout)); for (int i=1;i<=N;i++){ if (!dfn[i]) tarjian(i); } for (int i=0;i<tot;i++) { int u=Belong[edge[i].u]; int v=Belong[edge[i].v]; if (u==v) continue; degin[v]++; degout[u]++; } for (int i=1;i<=scc;i++) {if (degin[i]==0) { ans++; int tmp=INF; for (int j=1;j<=N;j++) { if (Belong[j]==i) tmp=min(tmp,val[j]); } ret+=tmp; } } printf("%d %d\n",ans,ret); } int main(){ while (scanf("%d%d",&N,&M)!=EOF) { for (int i=1;i<=N;i++) scanf("%d",&val[i]); init(); for (int i=1;i<=M;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v,9797); } calc(); } return 0; }
    最新回复(0)