这一下午写的。。
最后想把最小生成树一并解决的。。实在写不动了。。。都没顾上回去洗澡。。
今天下午就是最短路
Floyd
Dijkstra
Bellman_Ford
SPFA
学习资料可以看这个博客,http://blog.sina.com.cn/s/blog_7b7c7c5f01011yuu.html
他这个博客我打开有点卡。。应该是他加载了一些代码高亮的插件比较烦。。
题解:
hdu 1874:http://acm.hdu.edu.cn/showproblem.php?pid=1874
/*
单源最短路径裸题,注意同一条边可能输入多次
分别采用Floyd,Dijkstra,bellman_Ford,SPFA四种算法
当作以后的模版了
*/
#include<iostream>
#include<queue>
#include<algorithm>
#define Max 0xfffffff
#define N 205
using namespace std;
int n,m,s,e,map[N][N],mark[N],f[N],d[N],flag[N];
struct project
{
int x,y,w;
}Map[2*N];
queue<int> q;
void getmap()
{
int i,j,a,b,l;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
map[i][j]=(i==j?0:Max);
for(i=0;i<m;i++)
{
cin>>a>>b>>l;
map[a][b]=map[b][a]=min(map[a][b],l);
}
}
void getmap2()
{
for(int i=0;i<m;i++)
{
cin>>Map[i].x>>Map[i].y>>Map[i].w;
Map[i+m].y=Map[i].x;
Map[i+m].x=Map[i].y;
Map[i+m].w=Map[i].w;
}
}
void floyd(int s,int e)
{
int i,j,k;
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
if(map[s][e]<Max)
{
cout<<map[s][e]<<endl;
}
else
{
cout<<"-1"<<endl;
}
}
void Dijkstra()
{
int i,j,k,min;
memset(mark,0,sizeof(mark));
for(i=0;i<n;i++)
f[i]=map[s][i];
f[s]=0;
for(i=0;i<n;i++)
{
min=Max;
for(j=0;j<n;j++)
{
if(!mark[j]&&f[j]<min)
{
min=f[j];
k=j;
}
}
if(min==Max)
break;
mark[k]=1;
for(j=0;j<n;j++)
if(!mark[j]&&f[j]>f[k]+map[k][j])
f[j]=f[k]+map[k][j];
}
if(f[e]!=Max)
cout<<f[e]<<endl;
else
cout<<"-1"<<endl;
}
void Bellman_Ford()
{
int i,j;
for(i=0;i<n;i++)//Init
d[i]=Max;
d[s]=0;
for(i=0;i<n;i++)
for(j=0;j<2*m;j++)
{
if(d[Map[j].x]>d[Map[j].y]+Map[j].w)//relax x --w--> y
d[Map[j].x]=d[Map[j].y]+Map[j].w;
}
if(d[e]<Max)
cout<<d[e]<<endl;
else
cout<<"-1"<<endl;
}
void SPFA()
{
int i,x;
while(!q.empty())
{
q.pop();
}
memset(flag,0,sizeof(flag));
for(i=0;i<n;i++)
d[i]=Max;
d[s]=0;
q.push(s);
flag[s]=1;
while(!q.empty())
{
x=q.front();//出队列
q.pop();
flag[x]=0;
for(i=0;i<n;i++)
{
if(d[i]>d[x]+map[x][i])
{
d[i]=d[x]+map[x][i];
if(!flag[i])
{
q.push(i);;//入队列
flag[i]=1;
}
}
}
}
if(d[e]<Max)
cout<<d[e]<<endl;
else
cout<<"-1"<<endl;
}
int main()
{
while(cin>>n>>m)
{
getmap();
// getmap2();
cin>>s>>e;
// floyd(s,e);
// Dijkstra();
// Bellman_Ford();
SPFA();
}
return 0;
}
hdu 2112: http://acm.hdu.edu.cn/showproblem.php?pid=2112
/*
裸最短路
map不会用,借鉴网上的代码学习一下啊
话说要是不用map的话处理字符串好麻烦。。
*/
#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int dis[155], len[155][155];
bool visit[155];
#define MAX 0x3f3f3f3f
void Dijsktra(int start, int end)
{
int k, temp;
memset(visit, 0, sizeof(visit));
for(int i = start; i <= end; ++i)
dis[i] = (i == start ? 0 : MAX); //visit[start] = 1; //如果标记为1,则与temp比较的全都是MAX
for(int i = start; i <= end; ++i)
{
temp = MAX;
for(int j = start; j <= end; ++j)
if(!visit[j] && dis[j] < temp)
temp = dis[k = j];
visit[k] = 1;
if(temp == MAX) break;
for(int j = start; j <= end; ++j)
if(dis[j] > dis[k] + len[k][j])
dis[j] = dis[k] + len[k][j];
}
}
int main()
{
int num, iterator, distance, flag;
char begin[30], end[30];
char a[30], b[30];
map<string, int> station;
while(scanf("%d", &num) != EOF && num != -1)
{
station.clear();
memset(len, MAX, sizeof(len));
flag = 0;
scanf("%s%s", begin, end);
if(strcmp(begin, end) == 0) flag = 1;
station[begin] = 1;
station[end] = 2;
iterator = 3;
for(int i = 0; i < num; ++i)
{
scanf("%s%s%d", a, b, &distance);
if(!station[a])
station[a] = iterator++;
if(!station[b])
station[b] = iterator++;
len[station[a]][station[b]] = len[station[b]][station[a]] = distance;
}
if(flag)
{
printf("0\n");
continue;
}
Dijsktra(1, iterator);
if(dis[2] == MAX) printf("-1\n");
else printf("%d\n", dis[2]);
}
return 0;
}
hdu 2544: http://acm.hdu.edu.cn/showproblem.php?pid=2544
/*
最短路裸题,套模版~
*/
#include<iostream>
#define Max 0x3f3f3f3f
using namespace std;
int n,m;
int map[105][105],mark[105],f[10005];
int s,e;
void getmap()
{
int i,j,a,b,l;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=(i==j?0:Max);
for(i=1;i<=m;i++)
{
cin>>a>>b>>l;
map[a][b]=map[b][a]=min(map[a][b],l);
}
}
void Dijkstra()
{
int i,j,k,min;
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++)
f[i]=map[s][i];
f[s]=0;
for(i=1;i<=n;i++)
{
min=Max;
for(j=1;j<=n;j++)
{
if(!mark[j]&&f[j]<min)
{
min=f[j];
k=j;
}
}
if(min==Max)
break;
mark[k]=1;
for(j=1;j<=n;j++)
if(!mark[j]&&f[j]>f[k]+map[k][j])
f[j]=f[k]+map[k][j];
}
if(f[e]!=Max)
cout<<f[e]<<endl;
else
cout<<"-1"<<endl;
}
int main()
{
while(cin>>n>>m,n+m!=0)
{
getmap();
s=1;
e=n;
Dijkstra();
}
system("pause");
return 0;
}
hdu 1596: http://acm.hdu.edu.cn/showproblem.php?pid=1596
/*
最短路模版~
把加法改成乘法而已~
全局变量问题又wa了一次。。
*/
#include<iostream>
#include<cstdio>
#define Max -1
using namespace std;
int n;
int s,e;
double map[1005][1005];
double f[1005];
int mark[1005];
void getmap()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}
}
}
void Dijkstra()
{
int i,j,k;
double min;
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++)
f[i]=map[s][i];
f[s]=1;
for(i=1;i<=n;i++)
{
min=Max;
for(j=1;j<=n;j++)
{
if(!mark[j]&&f[j]>min)
{
min=f[j];
k=j;
}
}
if(min==Max)
break;
mark[k]=1;
for(j=1;j<=n;j++)
if(!mark[j]&&f[j]<f[k]*map[k][j])
f[j]=f[k]*map[k][j];
}
}
int main()
{
while(cin>>n)
{
getmap();
int q;
cin>>q;
while(q--)
{
cin>>s>>e;
Dijkstra();
if(f[e]>0)
{
printf("%.3lf\n",f[e]);
}
else
{
cout<<"What a pity!"<<endl;
}
}
}
system("pause");
return 0;
}
hdu 2680: http://acm.hdu.edu.cn/showproblem.php?pid=2680
/*
还是最短路,将图反向即可
注意是有向图。。。
wa了好多次。。。
*/
#include<iostream>
#include<algorithm>
#define Max 0x3f3f3f3f
using namespace std;
int n,m,s,e;
int map[1005][1005];
int mark[1005];
int f[20005];
int a[1005];
void getmap()
{
int i,j,a,b,l;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=(i==j?0:Max);
for(i=1;i<=m;i++)
{
cin>>a>>b>>l;
map[b][a]=min(map[b][a],l);
}
}
void Dijkstra()
{
int i,j,k,min;
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++)
f[i]=map[s][i];
f[s]=0;
for(i=1;i<=n;i++)
{
min=Max;
for(j=1;j<=n;j++)
{
if(!mark[j]&&f[j]<min)
{
min=f[j];
k=j;
}
}
if(min==Max)
break;
mark[k]=1;
for(j=1;j<=n;j++)
if(!mark[j]&&f[j]>f[k]+map[k][j])
f[j]=f[k]+map[k][j];
}
}
int main()
{
while(cin>>n>>m>>s)
{
int w;
getmap();
Dijkstra();
cin>>w;
int res=Max;
while(w--)
{
cin>>e;
res=min(res,f[e]);
}
if(res==Max)
{
cout<<"-1"<<endl;
}
else
{
cout<<res<<endl;
}
}
system("pause");
return 0;
}
刚刚同学问我c#什么读写锁解决饥饿什么的。。
完全听不懂。。
也不知道这样学算法竞赛对不对。。。
项目什么的也不是不搞
现在要先打牢算法基础。。~!