题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1827
如果某一个强连通分量的入度为0,那么很不幸,这一堆只能直接被他通知,至于具体通知这一堆中的哪一个,枚举一遍求这堆中花费最少的,最后把话费求和。
我的代码和AC了 的c++代码除了语法没有任何区别。。。就是过不去。看其他ac的代码,反复修改,还是一直wa,崩溃了,不知道是不是Java的测试数据出错了,然后我看了下历史,没有Java过的案例。。希望后来人过的能告诉我一声。或者帮我看看哪里出问题了。
代码:
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class Main {
static class edge{
int v,next;
}
static int maxn=1010;
static int maxm=2010;
static edge e[]=new edge[maxm];
static int value[]=new int[maxn];
static int p[]=new int[maxn];
static int n,m,eid,inx,scc;
static int dfn[]=new int[maxn];
static int low[]=new int[maxn];
static int belong[]=new int[maxn];
static boolean inStack[]=new boolean[maxn];
static int in[]=new int[maxn];
static Stack<Integer> s=new Stack<Integer>();
static void init(){
eid=0;
inx=0;
scc=0;
Arrays.fill(p, -1);
Arrays.fill(inStack, false);
Arrays.fill(dfn, 0);
Arrays.fill(low, 0);
Arrays.fill(in, 0);
for(int i=0;i<maxm;i++)
e[i]=new edge();
}
static void insert(int u,int v){
e[eid].v=v;
e[eid].next=p[u];
p[u]=eid++;
}
static void targan(int u){
low[u]=dfn[u]=(++inx);
s.push(u);
inStack[u]=true;
int j;
for(int i=p[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(dfn[v]==0){
targan(v);
low[u]=Math.min(low[u], low[v]);
}else if(inStack[v]){
low[u]=Math.min(low[u], dfn[v]);
}
}
if(dfn[u]==low[u]){
scc++;
do{
j=s.pop();
inStack[j]=false;
belong[j]=scc;
}while(j!=u);
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
n=sc.nextInt();
m=sc.nextInt();
init();
for(int i=1;i<=n;i++)
value[i]=sc.nextInt();
int u,v;
for(int i=0;i<m;i++){
u=sc.nextInt();
v=sc.nextInt();
insert(u,v);
}
for(int i=1;i<=n;i++){
if(dfn[i]==0){
targan(i);
}
}
//判断出入度
for(int i=1;i<=n;i++){
for(int j=p[i];j!=-1;j=e[j].next){
int c=e[j].v;
if(belong[i]!=belong[c])
in[belong[c]]++;
}
}
int sum=0;
int cnt=0;
for(int i=1;i<=scc;i++){
if(in[i]==0){
cnt++;
int min=0x3f3f3f3f;
for(int j=1;j<=n;j++){
if(belong[j]==i){
min=Math.min(value[j], min);
}
}
sum+=min;
}
}
System.out.println(cnt+" "+sum);
}
sc.close();
}
}