这是spj
#include<fstream>
#include<memory.h>
#include<stdlib.h>
#include<string>
#include<vector>
#include<set>
using namespace std;
ifstream fin, fout, fstd;
ofstream fscore, freport;
int score;
const int maxn = 5001;
int d[maxn];
int n, ans_out, ans_std;
int *A[maxn];
int *B[maxn];
int f[maxn], rank[maxn];
int find(int x){
if (f[x] != x) f[x] = find(f[x]);
return f[x];
}
void unionroot(int ra, int rb){
if (rank[ra] < rank[rb]) f[ra] = rb;
else if (rank[rb] < rank[ra]) f[rb] = ra;
else{
f[ra] = rb; rank[rb] ++;
}
}
void judge(){
fin>>n;
for(int i=1;i<=n;i++){
f[i]=i;rank[i]=0;
}
for(int i=1;i<=n;i++){
fin>>d[i];
A[i]=(int*)malloc(sizeof(int)*(d[i]+1));
for(int j=1;j<=d[i];j++) fin>>A[i][j];
}
fout>>ans_out;
for(int i=1;i<=n;i++){
int d_;
fout>>d_;
if(d[i]!=d_){
freport<<"Invalid degree number!";
fscore<<0<<endl;
return;
}
B[i]=(int*)malloc(sizeof(int)*(d[i]+1));
for(int j=1;j<=d[i];j++) fout>>B[i][j];
}
fstd>>ans_std;
int nums=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=d[i];j++) nums+=B[i][j];
if(ans_std !=ans_out || ans_out*2!=nums){
fscore<<0<<endl;
freport<<"Invalid edge numbers!";
return;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=d[i];j++)
if(B[i][j]){
int x=A[i][j];
if(find(i)==find(x)){
fscore<<0<<endl;
freport<<"Invalid results: not a forest!";
return;
}
else {
unionroot(find(i),find(x));
for(int k=1;k<=d[x];k++){
if(A[x][k]==i){
if(!B[x][k]){
fscore<<0<<endl;
freport<<"Invalid results!";
return;
}
else B[x][k]=0;
}
}
}
}
fscore<<score<<endl;
freport<<"Success!";
}
int main(int argc, char* argv[]){
//put something to fstreams...
/*
argv[1]:输入文件
argv[2]:选手输出文件
argv[3]:标准输出文件
argv[4]:单个测试点分值
argv[5]:输出最终得分的文件
argv[6]:输出错误报告的文件
*/
fin.open(argv[1]);
fout.open(argv[2]);
fstd.open(argv[3]);
fscore.open(argv[5]);
freport.open(argv[6]);
score = atoi(argv[4]);
judge();
fin.close();
fout.close();
fstd.close();
fscore.close();
freport.close();
return 0;
}
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1010;
bool G[maxn][maxn];
int n,t,fa[maxn],rk[maxn];
vector<int>ans[maxn];
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void Union(int x,int y){
x=find(x),y=find(y);
if(x==y) return;
if(rk[x]>rk[y]) fa[y]=x;
else if(rk[x]<rk[y]) fa[x]=y;
else
fa[x]=y,rk[y]++;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++){
int t,v;
scanf("%d",&t);
for(int j=1;j<=t;j++){
scanf("%d",&v);
if(find(i)!=find(v)) ans[i].push_back(1),Union(i,v),G[i][v]=1;
else if(G[v][i]) ans[i].push_back(1);
else ans[i].push_back(0);
}
}
for(int i=1;i<=n;i++){
printf("%d ",ans[i].size());
for(int j=0;j<ans[i].size();j++) printf("%d ",ans[i][j]);
printf("\n");
}
return 0;
}
/*
5
2 2 3
3 1 3 4
4 1 2 4 5
2 2 3
1 3
*/
这是我的代码
题目是找生成树森林,本地有数据和以上spj程序,请问怎么在本地测试