Moderator: Board moderators
The constraint 1 <= ri <= N-1 is wrong (even in the sample input, some ri = 0).
I am also not sure whether I understand the meaning of ri correctly.
5
1 2 2 4
-2 2 4 5
3 1 5
-4 0
5 1 1

#include<cstdio>
#include<vector>
#define UNVISITED 0
#define VISITED 1
#define BEING_VISITED 2
void dfs_rev(int);
void dfs_main(int);
void dfs_scc(int);
void dfs_MaxSum(int);
struct graph { char v_status; int like_val,scc_num; std::vector<int>adj_list; }graph_main[101],graph_rev[101],scc[101];
int post[100],indx,temp;
int main()
{
//freopen("input.txt","r",stdin);
int test,test_num=1,n,sz,x,sum,scc_num,i,j; bool flag=false;
for(scanf("%d",&test);test_num<=test;test_num++,flag=false)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
graph_main[i].v_status=graph_rev[i].v_status=graph_main[i].scc_num=0;
graph_main[i].adj_list.clear();
graph_rev[i].adj_list.clear();
}
for(i=1;i<=n;i++)
for(scanf("%d %d",&graph_main[i].like_val,&sz),j=0;j<sz;j++)
{
scanf("%d",&x);
graph_main[i].adj_list.push_back(x);
graph_rev[x].adj_list.push_back(i);
}
for(indx=0,i=1;i<=n;i++)
if(graph_rev[i].v_status==UNVISITED)
dfs_rev(i);
for(indx=0,i=n-1;i>=0;i--)
if(graph_main[post[i]].v_status==UNVISITED)
{
++indx;
scc[indx].v_status=scc[indx].like_val=0;
dfs_main(post[i]);
}
for(i=1,scc_num=indx,indx=0;i<=scc_num;i++)
if(scc[i].v_status==UNVISITED)
dfs_scc(i);
for(sum=i=0;i<indx;i++,temp=0)
{
scc[post[i]].v_status=UNVISITED;
dfs_MaxSum(post[i]);
if(temp>=0)
{
for(flag=true,sum+=temp,j=0;j<=i;j++)
if(scc[post[j]].v_status==BEING_VISITED)
scc[post[j]].v_status=VISITED;
}
else
for(j=0;j<=i;j++)
if(scc[post[j]].v_status==BEING_VISITED)
scc[post[j]].v_status=UNVISITED;
}
printf("Case #%d: ",test_num);
flag?printf("%d\n",sum):printf("Alas, sultan can't invite anyone!\n");
for(i=1;i<=scc_num;i++)
scc[i].adj_list.clear();
}
return 0;
}
void dfs_rev(int i)
{
graph_rev[i].v_status=VISITED;
for(int j=0,sz=graph_rev[i].adj_list.size();j<sz;j++)
if(graph_rev[graph_rev[i].adj_list[j]].v_status==UNVISITED)
dfs_rev(graph_rev[i].adj_list[j]);
post[indx++]=i;
}
void dfs_main(int i)
{
graph_main[i].v_status=VISITED;
graph_main[i].scc_num=indx;
scc[indx].like_val+=graph_main[i].like_val;
for(int j=0,sz=graph_main[i].adj_list.size();j<sz;j++)
if(graph_main[graph_main[i].adj_list[j]].v_status==UNVISITED)
dfs_main(graph_main[i].adj_list[j]);
else if(graph_main[graph_main[i].adj_list[j]].scc_num!=indx)
scc[indx].adj_list.push_back(graph_main[graph_main[i].adj_list[j]].scc_num);
}
void dfs_scc(int i)
{
scc[i].v_status=VISITED;
for(int j=0,sz=scc[i].adj_list.size();j<sz;j++)
if(scc[scc[i].adj_list[j]].v_status==UNVISITED)
dfs_scc(scc[i].adj_list[j]);
post[indx++]=i;
}
void dfs_MaxSum(int i)
{
scc[i].v_status=BEING_VISITED;
temp+=scc[i].like_val;
for(int j=0,sz=scc[i].adj_list.size();j<sz;j++)
if(scc[scc[i].adj_list[j]].v_status==UNVISITED)
dfs_MaxSum(scc[i].adj_list[j]);
}#include<cstdio>
#include<vector>
#define UNVISITED 0
#define VISITED 1
#define BEING_VISITED 2
void dfs_rev(int);
void dfs_main(int);
void dfs_scc(int);
void dfs_MaxSum(int);
struct graph { char v_status; int like_val,scc_num; std::vector<int>adj_list; }graph_main[101],graph_rev[101],scc[101];
int post[100],indx,temp;
int main()
{
int test,test_num=1,n,sz,x,sum,scc_num,i,j; bool flag=false;
for(scanf("%d",&test);test_num<=test;test_num++,flag=false)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
graph_main[i].v_status=graph_rev[i].v_status=graph_main[i].scc_num=0;
graph_main[i].adj_list.clear();
graph_rev[i].adj_list.clear();
}
for(i=1;i<=n;i++)
for(scanf("%d %d",&graph_main[i].like_val,&sz),j=0;j<sz;j++)
{
scanf("%d",&x);
graph_main[i].adj_list.push_back(x);
graph_rev[x].adj_list.push_back(i);
}
for(indx=0,i=1;i<=n;i++)
if(graph_rev[i].v_status==UNVISITED)
dfs_rev(i);
for(indx=0,i=n-1;i>=0;i--)
if(graph_main[post[i]].v_status==UNVISITED)
{
++indx;
scc[indx].v_status=scc[indx].like_val=0;
dfs_main(post[i]);
}
for(i=1,scc_num=indx,indx=0;i<=scc_num;i++)
if(scc[i].v_status==UNVISITED)
dfs_scc(i);
for(sum=i=0;i<indx;i++,temp=0)
{
scc[post[i]].v_status=UNVISITED;
dfs_MaxSum(post[i]);
if(temp>=0)
{
for(flag=true,sum+=temp,j=0;j<=i;j++)
if(scc[post[j]].v_status==BEING_VISITED)
scc[post[j]].v_status=VISITED;
}
else
for(j=0;j<=i;j++)
if(scc[post[j]].v_status==BEING_VISITED)
scc[post[j]].v_status=UNVISITED;
}
for(i=0;i<indx;i++)
{
if(scc[post[i]].v_status==UNVISITED)
{
dfs_MaxSum(post[i]);
if(temp>=0)
{
for(flag=true,sum+=temp,j=0;j<=i;j++)
if(scc[post[j]].v_status==BEING_VISITED)
scc[post[j]].v_status=VISITED;
}
else
for(j=0;j<=i;j++)
if(scc[post[j]].v_status==BEING_VISITED)
scc[post[j]].v_status=UNVISITED;
temp=0;
}
}
printf("Case #%d: ",test_num);
flag?printf("%d\n",sum):printf("Alas, sultan can't invite anyone!\n");
for(i=1;i<=scc_num;i++)
scc[i].adj_list.clear();
}
return 0;
}
void dfs_rev(int i)
{
graph_rev[i].v_status=VISITED;
for(int j=0,sz=graph_rev[i].adj_list.size();j<sz;j++)
if(graph_rev[graph_rev[i].adj_list[j]].v_status==UNVISITED)
dfs_rev(graph_rev[i].adj_list[j]);
post[indx++]=i;
}
void dfs_main(int i)
{
graph_main[i].v_status=VISITED;
graph_main[i].scc_num=indx;
scc[indx].like_val+=graph_main[i].like_val;
for(int j=0,sz=graph_main[i].adj_list.size();j<sz;j++)
if(graph_main[graph_main[i].adj_list[j]].v_status==UNVISITED)
dfs_main(graph_main[i].adj_list[j]);
else if(graph_main[graph_main[i].adj_list[j]].scc_num!=indx)
scc[indx].adj_list.push_back(graph_main[graph_main[i].adj_list[j]].scc_num);
}
void dfs_scc(int i)
{
scc[i].v_status=VISITED;
for(int j=0,sz=scc[i].adj_list.size();j<sz;j++)
if(scc[scc[i].adj_list[j]].v_status==UNVISITED)
dfs_scc(scc[i].adj_list[j]);
post[indx++]=i;
}
void dfs_MaxSum(int i)
{
scc[i].v_status=BEING_VISITED;
temp+=scc[i].like_val;
for(int j=0,sz=scc[i].adj_list.size();j<sz;j++)
if(scc[scc[i].adj_list[j]].v_status==UNVISITED)
dfs_MaxSum(scc[i].adj_list[j]);
}
2
7
1518 1 2
-5269 0
434 2 7 2
4608 1 2
-3748 3 1 4 2
-9929 2 1 7
1264 1 6
3
4569 1 3
6924 1 3
-7758 0Case #1: 857
Case #2: 3735 Connected SCCs
SCC num : 1, SCC_like_val : -5269, 1 ->
SCC num : 2, SCC_like_val : 4608, 2 -> 1,
SCC num : 3, SCC_like_val : 1518, 3 -> 1,
SCC num : 4, SCC_like_val : -8665, 4 -> 3,
SCC num : 5, SCC_like_val : 434, 5 -> 4, 1,
SCC num : 6, SCC_like_val : -3748, 6 -> 3, 2, 1,
Traversal Order of the SCCs : 1, 2, 3, 4, 5, 6
Case #1: Alas, sultan can't invite anyone!
Connected SCCs
SCC num : 1, SCC_like_val : -7758, 1 ->
SCC num : 2, SCC_like_val : 6924, 2 -> 1,
SCC num : 3, SCC_like_val : 4569, 3 -> 1,
Traversal Order of the SCCs : 1, 2, 3
Case #2: Alas, sultan can't invite anyone!
#include<cstdio>
#include<vector>
#define UNVISITED 0
#define VISITED 1
#define BEING_VISITED 2
void dfs_rev(int);
void dfs_main(int);
void dfs_scc(int);
void dfs_MaxSum(int);
struct graph { char v_status; int like_val,scc_num; std::vector<int>adj_list; }graph_main[101],graph_rev[101],scc[101];
int post[100],indx,temp;
int main()
{
//freopen("input.txt","r",stdin);
int test,test_num=1,n,sz,x,sum,scc_num,i,j; bool flag=false;
for(scanf("%d",&test);test_num<=test;test_num++,flag=false)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
graph_main[i].v_status=graph_rev[i].v_status=graph_main[i].scc_num=0;
graph_main[i].adj_list.clear();
graph_rev[i].adj_list.clear();
}
for(i=1;i<=n;i++)
for(scanf("%d %d",&graph_main[i].like_val,&sz),j=0;j<sz;j++)
{
scanf("%d",&x);
graph_main[i].adj_list.push_back(x);
graph_rev[x].adj_list.push_back(i);
}
for(indx=0,i=1;i<=n;i++)
if(graph_rev[i].v_status==UNVISITED)
dfs_rev(i);
for(indx=0,i=n-1;i>=0;i--)
if(graph_main[post[i]].v_status==UNVISITED)
{
++indx;
scc[indx].v_status=scc[indx].like_val=0;
dfs_main(post[i]);
}
for(i=1,scc_num=indx,indx=0;i<=scc_num;i++)
if(scc[i].v_status==UNVISITED)
dfs_scc(i);
for(sum=i=0;i<indx;i++,temp=0)
{
scc[post[i]].v_status=UNVISITED;
dfs_MaxSum(post[i]);
if(temp>=0)
{
for(flag=true,sum+=temp,j=0;j<=i;j++)
if(scc[post[j]].v_status==BEING_VISITED)
scc[post[j]].v_status=VISITED;
}
else
for(j=0;j<=i;j++)
if(scc[post[j]].v_status==BEING_VISITED)
scc[post[j]].v_status=UNVISITED;
}
printf("Case #%d: ",test_num);
flag?printf("%d\n",sum):printf("Alas, sultan can't invite anyone!\n");
for(i=1;i<=scc_num;i++)
scc[i].adj_list.clear();
}
return 0;
}
void dfs_rev(int i)
{
graph_rev[i].v_status=VISITED;
for(int j=0,sz=graph_rev[i].adj_list.size();j<sz;j++)
if(graph_rev[graph_rev[i].adj_list[j]].v_status==UNVISITED)
dfs_rev(graph_rev[i].adj_list[j]);
post[indx++]=i;
}
void dfs_main(int i)
{
graph_main[i].v_status=VISITED;
graph_main[i].scc_num=indx;
scc[indx].like_val+=graph_main[i].like_val;
for(int j=0,sz=graph_main[i].adj_list.size();j<sz;j++)
if(graph_main[graph_main[i].adj_list[j]].v_status==UNVISITED)
dfs_main(graph_main[i].adj_list[j]);
else if(graph_main[graph_main[i].adj_list[j]].scc_num!=indx)
scc[indx].adj_list.push_back(graph_main[graph_main[i].adj_list[j]].scc_num);
}
void dfs_scc(int i)
{
scc[i].v_status=VISITED;
for(int j=0,sz=scc[i].adj_list.size();j<sz;j++)
if(scc[scc[i].adj_list[j]].v_status==UNVISITED)
dfs_scc(scc[i].adj_list[j]);
post[indx++]=i;
}
void dfs_MaxSum(int i)
{
scc[i].v_status=BEING_VISITED;
temp+=scc[i].like_val;
for(int j=0,sz=scc[i].adj_list.size();j<sz;j++)
if(scc[scc[i].adj_list[j]].v_status==UNVISITED)
dfs_MaxSum(scc[i].adj_list[j]);
}Users browsing this forum: No registered users and 1 guest