9.12

来源:互联网 发布:广联达装修预算软件 编辑:程序博客网 时间:2024/06/05 14:10

是是是,我已经好多天没有写博客了,blog已经被我ignore了,hehe。

我们的学校,唉,把我们的放假时间从短暂的四天压缩到了简直可以忽略不计的两天,唉。

但是——不幸中的万幸,这两天我们可以整天泡机房,啦啦啦~\(≧▽≦)/~。

于是,这两天,我们开启了图论的学习之旅。它需要你有非一般的数学头脑,然而,我呢,进入高中以来,脑子就锈掉了,就没正常过。这两天整天泡在机房,再加上身心俱疲,我老是掉线。哎呀,这一掉线可不得了,那可是灭顶之灾啊。于是,从那个什么迪杰斯特拉开始,我就hehe了。然后呢,昨天晚上我本来回去开夜车好好补一下的,结果呢,刚好看到dijkstra我就心累了,就去zzz了。所以,没懂的照样没懂。

到现在为止,我们学了图的基本概念,图的存储方式(邻接矩阵和邻接表),图的遍历(dfs,bfs),贪心算法求最小路径(佛洛依德floyed,迪杰斯特拉dijkstra,贝尔曼福德bellman-ford,还有中国的SPFA),最小生成树(普利姆prim),拓扑排序。。。我可谓是浆糊一片了。。。





但在luogu的团队里,我还是去积极的完成作业的,恩就是这样,下面附上这两天我敲完的代码:

#A(我们团队里的题)田地上的环:

题目描述

FJ 让他的N (1 <= N <= 250)只编号为从1到N的奶牛在田地里玩.这些奶牛决定用M条(1<=M<=N*(N+1)/2)牛绳将各自连接起来.当然,不会出现一对牛被两条及以上牛绳连接起来.输入告诉你每一条牛绳连接的两只奶牛C1和C2(1 <= c1 <= N; 1 <= c2 <= N; c1 <> c2).

FJ要求奶牛们与1号奶牛相连.现在你要帮助FJ找出所有没有与1号奶牛相连的奶牛.这里的相连既可以是直接的,也可以是间接的(特别的,1号奶牛总是与自己相连).将没有与1号奶牛相连的奶牛的编号升序输出.如果你找不到这样的一只牛,那么就输出0.

输入输出格式

输入格式:

第1行:两个用空格分开的整数N,M

第2..M+1行:每一行有两个整数.第i+1行描述的是绳子i连接的两只奶牛的编号,即C1和C2.

输出格式:

很多行:每一行包含一个整数,意义如题目所说.升序输出.

输入输出样例

输入样例#1:
6 41 32 31 24 5
输出样例#1:
456









这道题是无向图+邻边矩阵+dfs遍历,一道基础题,当然是选择一遍过咯。哦不不不,第一遍提交是90,它告诉我too many or too few lines。什么?我根本就不知道为什么,当然是选择放弃咯。哦不不不,在刘老师的帮助下,他告诉我“输出0”。哦——一听就知道了,要特判!这个是我在C++道路上一直陪伴我的一个  唉。。。之后提交当然是过啦。


#include<bits/stdc++.h>using namespace std;int n,m,x,y,a[255][255]={};bool flag=true,b[255]={};void dfs(int t){b[t]=true;for (int i=1;i<=n;++i)if ((!b[i])&&a[t][i]) dfs(i);}//dfs遍历 int main(){cin>>n>>m;for (int i=1;i<=m;++i){cin>>x>>y;    a[x][y]=1;    a[y][x]=1;}//用邻接矩阵存储无向图 dfs(1);//题目要求 for (int i=2;i<=n;++i)if (!b[i]){    cout<<i<<endl;    flag=false;//flag用来特判是否有输出}if (flag==true) cout<<"0";//如果没有输出,那么输出0 return 0;}



#B图的遍历:

这道题有60分版的和100分版的,100分的我暂时还没去挑战,(因为脑细胞有限,,,60分版的是有向图+邻接矩阵+dfs,我是真的对我自己生无可恋,我敲了两遍这道题,用两种不同的方法,结果两遍都敲成了无——向——图,唉,这就是不看题目要求想当然的后果啊。


#include<bits/stdc++.h>using namespace std;int n,m,x,y,l,k,a[10005][10005]={};//数组范围不能太大,因此10^5达不到 bool b[10005]={};void dfs(int t){b[t]=true;for (int j=1;j<=n;++j)if ((!b[j])&&a[t][j]) dfs(j);}//dfs遍历 int main(){cin>>n>>m;for (int i=1;i<=m;++i){cin>>x>>y;a[x][y]=1;}//用邻接矩阵存储有向图 for (int i=1;i<=n;++i){memset(b,0,sizeof(b));//每一遍dfs(i)都要重置数组 dfs(i);for (int k=n;k>=1;k--)if (b[k]){cout<<k<<" ";break;}    }return 0;}




#C回家:
这道题是求最小路径,贪心,无向图+邻接矩阵+floyed算法,一遍过。


#include<bits/stdc++.h>using namespace std;int n,x,y,z,t,min_=2000000000,a[60][60];char b,c;void floyed(){for (int k=1;k<=52;++k)for (int i=1;i<=52;++i)for (int j=1;j<=52;++j)if (a[i][k]+a[k][j]<a[i][j]) a[i][j]=a[i][k]+a[k][j];}//floyed算法 int main(){cin>>n;memset(a,10,sizeof(a));//a数组初始一个很大的值 for (int i=1;i<=n;++i){cin>>b>>c>>z;if (b>='A'&&b<='Z') x=b-64;if (b>='a'&&b<='z') x=b-70;if (c>='A'&&c<='Z') y=c-64;if (c>='a'&&c<='z') y=c-70;//因为输入的是大小写字母,要转化一下 a[x][y]=min(a[x][y],z);a[y][x]=min(a[y][x],z);//这两句是要考虑权值覆盖的问题 }floyed();for (int i=1;i<=25;++i){if (a[26][i]<min_){min_=a[26][i];t=i;}    if (a[i][26]<min_)    {    min_=a[i][26];    t=i;    }}//找最小路径     x=char(t+64);//因为输出的是字母,要处理一下 cout<<x<<" "<<min_;return 0;}




#D热浪:

这道题也是求最小路径,贪心,但是无向图+邻接矩阵+dijkstra算法,也是一遍过。

#include<bits/stdc++.h>using namespace std;int t,c,tc,te,x,y,z,a[2505][2505],d[2505];void dijkstra(int st){bool b[2505]={};for (int i=1;i<=t;++i)d[i]=a[st][i];    b[st]=true;    d[st]=0;    for (int i=1;i<=t-1;++i)    {    int min_=2000000000,k=0;    for (int j=1;j<=t;++j)    if ((!b[j])&&d[j]<min_)    {    min_=d[j];    k=j;    }    if (k==0) return;    b[k]=true;    for (int j=1;j<=t;++j)    if ((!b[j])&&d[k]+a[k][j]<d[j]) d[j]=d[k]+a[k][j];    }}//dijkstra算法 int main(){cin>>t>>c>>tc>>te;memset(a,10,sizeof(a));//a数组初始一个很大的值 for (int i=1;i<=c;++i){cin>>x>>y>>z;a[x][y]=min(a[x][y],z);a[y][x]=min(a[y][x],z);//这两句是要考虑权值覆盖的问题 }dijkstra(tc);//起点 cout<<d[te];//终点     return 0;}


原创粉丝点击