您的位置:首页 > 其它

[kuangbin带你飞]专题四 最短路练习

2015-08-07 16:02 344 查看
题目已经写了许久了,贴一下代码,以便自己以后的查阅。

A - Til the Cows Come Home[b] 题目地址[/b]
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <stdlib.h>
#include <map>
#define INF 0x7ffffff
#define MAXN 159
using namespace std;

int n,m,start,end;
int g[1009][1009],d[1009],final[1009],ss[1009];

void Dijkstra(int s,int n)
{
int v,Min;
memset(final,0,sizeof(final));
for(int i=1;i<=n;i++)
d[i]=g[s][i];
d[s]=0;
final[s]=1;
for(int i=1;i<=n;i++)
{
Min=INF;
for(int w=1;w<=n;w++)
{
if(!final[w]&&d[w]<Min)
{
Min=d[w];
v=w;
}
}
if(v==INF)
break;
final[v]=1;
for(int w=1;w<=n;w++)
{
if(!final[w]&&d[v]+g[v][w]<d[w])
{
d[w]=d[v]+g[v][w];
}
}
}
printf("%d\n",d
);
}

void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=g[j][i]=INF;
}

int main()
{
//freopen("in","r",stdin);
//freopen("out","w",stdout);
int T;
scanf("%d%d",&T,&n);init();
while(T--)
{
int a,b,time;
scanf("%d%d%d",&a,&b,&time);
if(g[a][b]>time)
{
g[a][b]=g[b][a]=time;
}
}
Dijkstra(1,n);
return 0;
}


[b]B -
Frogger 题目地址

[/b]
错的次数比较多,这个应该不是自己写的,当时贴的代码,最后再做一遍吧。。
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>
#include <queue>
#include <stack>
using namespace std;

#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","w",stdout)
#define For1(i,a,b) for (i=a;i<b;i++)
#define For2(i,a,b) for (i=a;i<=b;i++)
#define Dec(i,a,b) for (i=a;i>b;i--)
#define Dec2(i,a,b) for (i=a;i>=b;i--)
#define Sca_d(x) scanf("%d",&x)
#define Sca_s(x) scanf("%s",x)
#define Sca_c(x) scanf("%c",&x)
#define Sca_f(x) scanf("%f",&x)
#define Sca_lf(x) scanf("%lf",&x)
#define Sca_ld(x) scanf("%I64d",&x)
#define Fill(x,a) memset(x,a,sizeof(x))

const int maxn=1010;
const int INF=99999999;

bool vis[maxn];
int pre[maxn];
int x[maxn];
int y[maxn];
double Map[maxn][maxn],ans[maxn];

void Dijkstra(double cost[][maxn],double lowcost[],int n,int beg)
{
int i,j,k,Min;
For2(i,1,n)
{
lowcost[i]=INF;
vis[i]=false;
pre[i]=-1;
}
lowcost[beg]=0;//起点初始化
For2(j,1,n)
{
k=-1;
Min=INF;
For2(i,1,n)
if (!vis[i]&&lowcost[i]<Min)
{
Min=lowcost[i];
k=i;
}
if (k==-1) break;
vis[k]=true;
For2(i,1,n)
if (!vis[i]&&(max(lowcost[k],cost[k][i])<lowcost[i])&&cost[k][i])
{
lowcost[i]=max(lowcost[k],cost[k][i]);
pre[i]=k;
}
}
}

int main()
{
//input;
int t,n,a,b,c,i,j,k,Case=0;
while(cin>>n,n)
{
Fill(x,0);
Fill(y,0);
Fill(Map,0);
For2(i,1,n) Sca_d(x[i]),Sca_d(y[i]);
For2(i,1,n-1)
For2(j,i+1,n)
Map[i][j]=Map[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
Dijkstra(Map,ans,n,1);
printf("Scenario #%d\n",++Case);
printf("Frog Distance = %.3f\n\n",ans[2]);
}
return 0;
}


[b]C -
Heavy Transportation 题目地址

[/b]
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define inf 1<<29
#define min(a,b) (a<b?a:b)

const int maxn=1001;
int n,m;
int map[maxn][maxn];

int Dijkstra()
{
int i,j,k;
int dist[maxn];
bool pre[maxn];
for(i=1;i<=n;i++)
{
pre[i]=false;
dist[i]=map[1][i];
}

for(i=1;i<=n;i++)
{
int mm=-1;
for(j=1;j<=n;j++)
{
if(!pre[j]&&dist[j]>mm)
{
mm=dist[j];
k=j;
}
}

pre[k]=true;

for(j=1;j<=n;j++)
{
if(!pre[j]&&dist[j]<min(dist[k],map[k][j]))
dist[j]=min(dist[k],map[k][j]);
}
}
return dist
;
}
int main()
{
int T,i,j;
scanf("%d",&T);
int t=1;
while(T--)
{
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=0;
for(i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
printf("Scenario #%d:\n",t++);
printf("%d\n\n",Dijkstra());
}
return 0;
}


[b]D -
Silver Cow Party 题目地址

[/b]
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;

const int MAXN=1005;

#define INF 0x7ffffff

int cost[MAXN][MAXN],cost2[MAXN][MAXN];
int lowcost[MAXN];
int pre[MAXN];
bool vis[MAXN];
int n;

void Dijkstra(int cost[][MAXN],int lowcost[],int n,int beg)
{
for(int i=1;i<=n;i++)
{
lowcost[i]=INF;
vis[i]=false;
pre[i]=-1;
}
lowcost[beg]=0;
for(int j=1;j<=n;j++)
{
int k=-1;
int Min=INF;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&lowcost[i]<Min)
{
Min=lowcost[i];
k=i;
}
}
if(k==-1)
break;
vis[k]=true;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])
{
lowcost[i]=lowcost[k]+cost[k][i];
pre[i]=k;
}
}
}
}

void init()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
cost[i][j]=INF;
cost2[j][i]=INF;
}
}

int dis1[MAXN],dis2[MAXN];

int main()
{
int m,start;
while(scanf("%d%d%d",&n,&m,&start)==3)
{
init();
memset(dis1,0,sizeof(dis1));
memset(dis2,0,sizeof(dis2));
for(int i=0;i<m;i++)
{
int a,b,time;
scanf("%d%d%d",&a,&b,&time);
if(cost[a][b]>time)
{
cost[a][b]=time;
}
if(cost2[b][a]>time)
{
cost2[b][a]=time;
}
}
Dijkstra(cost,dis1,n,start);
Dijkstra(cost2,dis2,n,start);
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dis1[i]+dis2[i]);
}
printf("%d\n",ans);
}
return 0;
}


[b]H -
Cow Contest 题目地址

[/b]
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;

const int MAXN=105;
int cost[MAXN][MAXN];

void Floyd(int n)
{
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
cost[i][j]=(cost[i][k]&cost[k][j])||cost[i][j];
}

void init(int n)
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
if(i==j)
cost[i][j]=1;
else
cost[i][j]=0;
}
}

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
init(n);
int a,b;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
cost[a][b]=1;
}

Floyd(n);

int sum=0;
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=1;j<=n;j++)
{
if(cost[j][i])
cnt++;
if(cost[i][j])
cnt++;

}
if(cnt==n+1)
sum++;
}
printf("%d\n",sum);
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: