/*
HDOJ 2066
最短路算法的简单应用
*/
#include <iostream>
using namespace std;
#define INF 9999999
int graph[1005][1005];
bool find[1005];
int dist[1005];
int s[1005];
int d[1005];
int S,T,D;
void Shortest_Path(int sourse)
{
for(int i=1;i<=1000;i++)
{
find[i]=0;
dist[i]=graph[sourse][i];
}
find[sourse]=1;
dist[sourse]=0;
int min=INF,u;
for(i=2;i<=1000;i++)
{
min=INF;
for(int j=1;j<=1000;j++)
{
if(find[j]==0 && dist[j]<min)
{
min=dist[j];
u=j;
}
}
if(min == INF)
return ;
find[u]=1;
for(j=1;j<=1000;j++)
if(find[j]==0 && min+graph[u][j]<dist[j])
dist[j]=min+graph[u][j];
}
}
int main()
{
int a,b,c,i,j,min;
while(cin>>T>>S>>D)
{
for(i=1;i<=1000;i++)
for(j=1;j<=1000;j++)
graph[i][j]=INF;
for(i=1;i<=T;i++)
{
cin>>a>>b>>c;
if(c < graph[a][b])
{
graph[a][b]=c;
graph[b][a]=c;
}
}
for(i=1;i<=S;i++)
cin>>s[i];
for(i=1;i<=D;i++)
cin>>d[i];
min=INF;
for(i=1;i<=S;i++)
{
Shortest_Path(s[i]);
for(j=1;j<=D;j++)
if(dist[d[j]] < min)
min=dist[d[j]];
}
cout<<min<<endl;
}
return 0;
}
HDOJ 1874 畅通工程续
//最短路算法
//数据可能会有重复边,所以要检测,保存较小的权值
#include <iostream>
using namespace std;
#define INF 9999999
int graph[200][200];
bool find[200];
int dist[200];
int N,M;
void Shortest_Path(int sourse)
{
for(int i=0;i<N;i++)
{
find[i]=0;
dist[i]=graph[sourse][i];
}
find[sourse]=1;
dist[sourse]=0;
int min=INF,u;
for(i=1;i<N;i++)
{
min=INF;
for(int j=0;j<N;j++)
{
if(find[j]==0 && dist[j]<min)
{
min=dist[j];
u=j;
}
}
if(min == INF)
return ;
find[u]=1;
for(j=0;j<N;j++)
if(find[j]==0 && min+graph[u][j]<dist[j])
dist[j]=min+graph[u][j];
}
}
int main()
{
int a,b,c,i,j,s,t;
while(cin>>N>>M)
{
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)
graph[i][j]=INF;
for(i=0;i<M;i++)
{
cin>>a>>b>>c;
if(c < graph[a][b])
{
graph[a][b]=c;
graph[b][a]=c;
}
}
cin>>s>>t;
Shortest_Path(s);
if(dist[t]==INF)
cout<<-1<<endl;
else
cout<<dist[t]<<endl;
}
return 0;
}
HDOJ 2544 最短路
/*
HDOJ 2544
简单的利用单元最短路算法就可以
*/
#include <iostream>
using namespace std;
#define INF 9999999
int graph[101][101];
bool find[101];
int dist[101];
int N,M;
void Shortest_Path(int sourse)
{
for(int i=1;i<=N;i++)
{
find[i]=0;
dist[i]=graph[sourse][i];
}
find[sourse]=1;
dist[sourse]=0;
int min=INF,u;
for(i=2;i<=N;i++)
{
min=INF;
for(int j=1;j<=N;j++)
{
if(find[j]==0 && dist[j]<min)
{
min=dist[j];
u=j;
}
}
if(min == INF)
return ;
find[u]=1;
for(j=1;j<=N;j++)
if(find[j]==0 && min+graph[u][j]<dist[j])
dist[j]=min+graph[u][j];
}
}
int main()
{
int a,b,c,i,j;
while(cin>>N>>M)
{
if(N==0 && M==0)
break;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
graph[i][j]=INF;
for(i=1;i<=M;i++)
{
cin>>a>>b>>c;
graph[a][b]=c;
graph[b][a]=c;
}
Shortest_Path(1);
cout<<dist[N]<<endl;
}
return 0;
}
HDOJ 2112 HDU Today
/*
HDOJ 2112
最短路算法简单应用
*/
#include <iostream>
#include <string>
using namespace std;
#define INF 999999
char str[155][40]; //存站点名称
int graph[155][155];
int strlengs; //站点数目
int find[155];
int dist[155]; //存最短距离
int Search_str(char name[40])
{
for(int i=0;i<strlengs;i++)
{
if(!strcmp(name,str[i]))
return i;
}
strcpy(str[strlengs++],name);
return (strlengs-1);
}
void Shortest_Path(int star)
{
for(int i=0;i<strlengs;i++)
{
find[i]=0;
dist[i]=graph[star][i];
}
find[star]=1;
dist[star]=0;
int min,u;
for(i=1;i<strlengs;i++)
{
min=INF;
u=-1;
for(int j=0;j<strlengs;j++)
{
if(find[j]==0 && dist[j]<min)
{
min=dist[j];
u=j;
}
}
if(min == INF)
return;
find[u]=1;
for(j=0;j<strlengs;j++)
if(find[j]==0 && dist[u]+graph[u][j]<dist[j])
dist[j]=dist[u]+graph[u][j];
}
}
int main()
{
int N,i,j;
char A[40],B[40];
int a,b,c,star,end;
while(cin>>N)
{
if(N == -1)
break;
star=0;
end=1;
cin>>str[star]>>str[end];
strlengs=2;
for(i=0;i<155;i++)
for(j=0;j<155;j++)
graph[i][j]=INF;
for(i=0;i<N;i++)
{
cin>>A;
a=Search_str(A);
cin>>B;
b=Search_str(B);
cin>>c;
if(c<graph[a][b] && a!=b)
{
graph[a][b]=c;
graph[b][a]=c;
}
}
if(!strcmp(str[star],str[end]))
cout<<0<<endl;
else
{
Shortest_Path(star);
if(dist[end] == INF)
cout<<-1<<endl;
else
cout<<dist[end]<<endl;
}
}
return 0;
}
/*
HDOJ 2112
用map来精简代码长度,主要还是最短路算法的应用
*/
#pragma warning (disable:4786)
#include <iostream>
#include <string>
#include <map>
using namespace std;
#define INF 999999
int graph[155][155];
int dist[155];
int find[155];
int station_sum;
void Dijsktra(int star)
{
int i,j,min,u;
for(i=1;i<=station_sum;i++)
{
find[i]=0;
dist[i]=graph[star][i];
}
find[star]=1;
dist[star]=0;
for(i=2;i<=station_sum;i++)
{
min=INF;
u=-1;
for(j=1;j<=station_sum;j++)
{
if(!find[j] && dist[j]<min)
{
min=dist[j];
u=j;
}
}
if(min == INF)
return;
find[u]=1;
for(j=1;j<=station_sum;j++)
if(!find[j] && dist[u]+graph[u][j]<dist[j])
dist[j]=dist[u]+graph[u][j];
}
}
int main()
{
int N,i,j,w,a,b;
string buf1,buf2,star,end;
map<string,int> station;
while(cin>>N)
{
if(N == -1)
break;
station.clear();
for(i=1;i<155;i++)
for(j=1;j<155;j++)
graph[i][j]=INF;
cin>>star>>end;
station[star]=1;
station[end]=2;
station_sum=2;
for(i=1;i<=N;i++)
{
cin>>buf1>>buf2>>w;
a=station[buf1];
if(a == 0)
a=station[buf1]=++station_sum;
b=station[buf2];
if(b == 0)
b=station[buf2]=++station_sum;
if(w < graph[a][b])
{
graph[a][b]=w;
graph[b][a]=w;
}
}
if(star == end)
{
cout<<0<<endl;
continue;
}
Dijsktra(1);
if(dist[2] == INF)
cout<<-1<<endl;
else
cout<<dist[2]<<endl;
}
return 0;
}