寒假练习练手,试着裸敲模板。
最短路——Dijkstra_O(n^2)算法
第一题poj2387:求1-n最短路
//M:4608k T:63ms
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int inf=2000005;
const int maxn=1005;
int mp[maxn][maxn];
int vis[maxn],d[maxn];
int n,t; //vex,edge
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
mp[i][j]=inf;
mp[i][i]=0;
}
}
void dijkstra(int s){
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++) d[i]=mp[s][i];
vis[s]=1;
for(int i=0;i<n;i++){
int minv,mine=inf;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]<mine){
mine=d[j];
minv=j;
}
}
vis[minv]=1;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]>d[minv]+mp[minv][j])
d[j]=d[minv]+mp[minv][j];
}
}
}
int main()
{
int u,v,w;
while(~scanf("%d%d",&t,&n)){
init();
for(int i=0;i<t;i++){
scanf("%d%d%d",&u,&v,&w);
mp[u][v]=min(mp[u][v],w);
mp[v][u]=min(mp[v][u],w);
}
dijkstra(n);
printf("%d\n",d[1]);
}
return 0;
}
第二题poj1797:求1-n路径中,最小边的最大值
//M:4608k T:360ms
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1005;
int n,m;
int mp[maxn][maxn],vis[maxn],d[maxn];
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
mp[i][j]=0;
}
}
void dijkstra(int s){
for(int i=1;i<=n;i++){
d[i]=mp[s][i];
vis[i]=0;
}
vis[s]=1;
for(int i=0;i<n;i++){
int maxv,maxe=-1;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]>maxe){
maxe=d[j];
maxv=j;
}
}
vis[maxv]=1;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]<min(d[maxv],mp[maxv][j]))
d[j]=min(d[maxv],mp[maxv][j]);
}
}
}
int main()
{
int t;
int u,v,w;
scanf("%d",&t);
int cas=0;
while(t--){
cas++;
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
mp[u][v]=mp[v][u]=w;
}
dijkstra(n);
printf("Scenario #%d:\n",cas);
printf("%d\n\n",d[1]);
}
return 0;
}
第三题poj2253:求1-n路径中,最大边的最小值
//M:1008k T:0ms
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const double inf=0x3f3f3f3f;
const int maxn=205;
double mp[maxn][maxn],d[maxn],p[maxn][2];
int vis[maxn];
int n;
double dis(int i,int j){
return sqrt((p[i][0]-p[j][0])*(p[i][0]-p[j][0])+(p[i][1]-p[j][1])*(p[i][1]-p[j][1]));
}
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
mp[i][j]=inf;
mp[i][i]=0.0;
}
}
void dijkstra(int s){
for(int i=1;i<=n;i++){
d[i]=mp[s][i];
vis[i]=0;
}
vis[s]=0;
for(int i=0;i<n;i++){
int minv;
double mine=inf;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]<mine){
mine=d[j];
minv=j;
}
}
vis[minv]=1;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]>max(mp[minv][j],d[minv]))
d[j]=max(mp[minv][j],d[minv]);
}
}
}
int main(){
int cas=0;
while(~scanf("%d",&n)&&n){
cas++;
for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i][0],&p[i][1]);
init();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[i][j]=dis(i,j);
}
}
dijkstra(1);
printf("Scenario #%d\nFrog Distance = %.3f\n\n",cas,d[2]);
}
return 0;
}