T1
裸的拓扑排序
1 #include <cstdio> 2 #include <cstring> 3 struct E{ 4 int next,to; 5 }e[100001]; 6 int n,m,t,a,b,sz,pd,head[100001],reg[100001],in[100001]; 7 void insert(int a,int b) 8 { 9 sz++; 10 e[sz].next=head[a]; 11 head[a]=sz; 12 e[sz].to=b; 13 } 14 int dfs(int x) 15 { 16 reg[x]=1;in[x]=1; 17 for (int i=head[x];i;i=e[i].next) 18 { 19 if (in[e[i].to]) 20 { 21 pd=0; 22 return 1; 23 } 24 else 25 { 26 if (!reg[e[i].to]&&dfs(e[i].to)) return 1; 27 } 28 } 29 in[x]=0; 30 return 0; 31 } 32 int main() 33 { 34 scanf("%d",&t); 35 while(t--) 36 { 37 memset(head,0,sizeof(head)); 38 memset(reg,0,sizeof(reg)); 39 memset(in,0,sizeof(in)); 40 sz=0;pd=1; 41 scanf("%d%d",&n,&m); 42 for (int i=1;i<=m;i++) 43 { 44 scanf("%d%d",&a,&b); 45 insert(a,b); 46 } 47 for (int i=1;i<=n;i++) if (pd&&!reg[i]) dfs(i); 48 printf("%d\n",pd); 49 } 50 }
T2
略微改编的最短路
1 #include <cstdio> 2 #include <cstring> 3 int t,n,m[101][101],f[101],in[101]; 4 char x; 5 void dfs(int x) 6 { 7 int cnt=0; 8 for (int i=1;i<=n;i++) 9 { 10 if (m[x][i]==1) 11 { 12 if (f[i]==-1||f[x]+cnt<f[i]) 13 { 14 f[i]=f[x]+cnt; 15 dfs(i); 16 } 17 cnt++; 18 } 19 } 20 } 21 int main() 22 { 23 freopen("dna.in","r",stdin); 24 freopen("dna.out","w",stdout); 25 scanf("%d",&t); 26 while(t--) 27 { 28 scanf("%d",&n); 29 for (int i=1;i<=n;i++) 30 { 31 getchar(); 32 for (int j=1;j<=n;j++) 33 { 34 scanf("%c",&x); 35 if (x==‘Y‘) m[i][j]=1; 36 } 37 } 38 f[1]=0; 39 dfs(1); 40 printf("%d\n",f[n]); 41 } 42 }
T3
题目描述:
有一个魔术师,他有 n 个未知整数,每个数是 0 或者 1,你的目的是猜出魔术师的这 n 个未 知数。
为了猜出 n 个未知数,你可以向魔术师询问第 x 到第 y 个数的异或和,但是每次询问你都需 要给魔术师一定的金钱,不同的询问需要不同的金钱。
你现在需要计算出猜出这 n 个数至少需要花费多少钱。
一道略有难度的MST
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 struct E{ 5 int a,b,w; 6 }e[1000001]; 7 int n,w,sz=0,ans=0,cnt=0,f[1001]; 8 bool cmp(E a,E b) {return a.w<b.w;} 9 int find(int x) 10 { 11 if (x!=f[x]) return f[x]=find(f[x]); 12 return x; 13 } 14 int main() 15 { 16 scanf("%d",&n); 17 for (int i=0;i<n;i++) for (int j=1;j<=n;j++) 18 { 19 scanf("%d",&w); 20 if (i<j) sz++,e[sz].a=i,e[sz].b=j,e[sz].w=w; 21 } 22 for (int i=0;i<=n;i++) f[i]=i; 23 sort(e+1,e+1+sz,cmp); 24 for (int i=1;i<=sz&&cnt<=n;i++) 25 { 26 if (find(e[i].a)!=find(e[i].b)) 27 { 28 f[f[e[i].a]]=f[e[i].b]; 29 ans+=e[i].w; 30 cnt++; 31 } 32 } 33 printf("%d",ans); 34 }
时间: 2024-10-04 16:14:06