1.做题
(1).[USACO09OCT]Heat Wave G - 洛谷
模板题,就不多说了
#include<iostream>
#include<cstring>
using namespace std;
int e[3000][3000],dis[3000],book[3000];
int inf=99999999;
int main()
{
int i,j,k,t1,t2,t3,n,m,s,t,u,v,min;
/*读入n和m,n表示顶点个数,m表示边的条数*/
cin>>n>>m>>s>>t;
/*初始化*/
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i == j) e[i][j]=0;
else e[i][j]=inf;
/*读入边*/
for (i=1;i<=m;i++)
{
cin>>t1>>t2>>t3;
e[t1][t2]=t3;
e[t2][t1]=t3;
}
/*初始化dis数组与book数组,这里是s号顶点到其余各个顶点的初始路程*/
for(i=1;i<=n;i++)
{
book[i]=0;
dis[i]=e[s][i];
}
book[s]=1;
/*dijkstra算法核心语句*/
for(i=1;i<=n-1;i++)
{
/*找到离s号顶点最近的顶点*/
min=inf;
for(j=1;j<=n;j++)
{
if(book[j] == 0 && dis[j] < min)
{
min=dis[j];
u=j;
}
}
book[u]=1;//将最近顶点标记,并由该点向外寻找顶点并更新其最短路
for(v=1;v<=n;v++)
{
if(e[u][v] < inf )
{
if(dis[v] > dis[u] + e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
cout<<dis[t]<<endl;
system("pause");
return 0;
}
(2).邮递员送信 - 洛谷
这题可以先看做普通的单源最短路的题,先把所有节点的最短路权值累加后将图反转,形成新的单源最短路
反转实现代码如下
void reverse()/*将矩阵反转*/
{
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
int t=0;
t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
}
最终代码
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int a[2000][2000],dis[2000],i,j,n,m,ans=0;
const int inf=1e9;
void dijkstra()
{
int book[2000]={0};
book[1]=1;
int v;
for(i=1;i<n;i++)
{
int min=inf;
for(j=1;j<=n;j++)
{
if(book[j] == 0 && min > dis[j])//找未标记中最小的
{
min=dis[j];
v=j;
}
}
book[v]=1;//标记
for(j=1;j<=n;j++)
{
if(book[j] == 0 && a[v][j] + dis[v] < dis[j])//更新路径长度
{
dis[j]=a[v][j]+dis[v];
}
}
}
}
void reverse()/*将矩阵反转*/
{
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
int t=0;
t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
}
int main()
{
int x,y,z;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
a[i][j]=inf;//求最短要初始化为无限大
for(i=1;i<=m;i++)
{
cin>>x>>y>>z;
a[x][y]=min(a[x][y],z);
}
for(i=1;i<=n;i++)
dis[i]=a[1][i];//路径长度初始化
dijkstra();
for(i=1;i<=n;i++)
ans+=dis[i];
reverse();//翻转
for(i=1;i<=n;i++)//路径长度初始化
{
dis[i]=a[1][i];
}
dijkstra();
for(i=1;i<=n;i++)
ans+=dis[i];
cout<<ans<<endl;
system("pause");
return 0;
}
2.学习链式前向星
可惜还没完全整明白,没能运用这个做出题。
3.上周自我评价
学习kmp时有些阻塞,学习速度较慢,不过最后还是完成了题目完成的要求。上周主要就是学了kmp与hash,了解了一下map的一些基础用法,没有其它额外的学习扩展。