Day 9.2

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