最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 36086 Accepted Submission(s): 15700
輸入保證至少存在1條商店到賽場的路線。
解題思路:
裸裸的Dijkstra的模板題,什麼變化都沒有,直接上就好了。
代碼:
# include<cstdio>
# include<iostream>
using namespace std;
# define MAX 100+4
# define inf 99999999
int edge[MAX][MAX];
int dis[MAX];
int book[MAX];
int n,m;
int u,v;
void init()
{
for ( int i = 1;i <= n;i++ )
{
for ( int j = 1;j <= n;j++ )
{
if ( i==j )
{
edge[i][j] = 0;
}
else
{
edge[i][j] = inf;
}
}
}
}
void input()
{
for ( int i = 1;i <= m;i++ )
{
int t1,t2,t3;
cin>>t1>>t2>>t3;
edge[t1][t2] = edge[t2][t1] = t3;
}
}
void Dijkstra()
{
for ( int i = 1;i <= n;i++ )
{
dis[i] = edge[1][i];
book[i] = 0;
}
dis[1] = 0;
book[1] = 1;
int _min;
for ( int i = 1;i <= n-1;i++ )
{
_min = inf;
for ( int 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 ( book[v] == 0 && dis[v] > dis[u]+edge[u][v] )
{
dis[v] = dis[u] + edge[u][v];
}
}
}
}
int main(void)
{
while ( cin>>n>>m )
{
if ( n==0&&m==0 )
break;
init();
input();
Dijkstra();
printf("%d\n",dis[n]);
}
}
由於剛學SPFA,故用SPFA來解決下,,,因爲SPFA的複雜度是O(E),而Dijkstra的複雜度是O(ElogV),SPFA還是相當快的。。。用SPFA的時候,queue可以用STL中的,也可以用數組來模擬,兩個差不多,習慣那個用哪個吧。。。。有關SPFA的詳細介紹,在後面的blog中還會陸續更新的。。。
# include<cstdio>
# include<iostream>
# include<queue>
using namespace std;
# define MAX 100+4
# define inf 99999999
int edge[MAX][MAX];
int dis[MAX];
int book[MAX];
int n,m;
int ans;
queue<int>q;
void init()
{
for ( int i = 1;i <= n;i++ )
{
for ( int j = 1;j <= n;j++ )
{
if ( i==j )
{
edge[i][j] = 0;
}
else
{
edge[i][j] = inf;
}
}
}
}
void input()
{
for ( int i = 1;i <= m;i++ )
{
int t1,t2,t3;
cin>>t1>>t2>>t3;
edge[t1][t2] = edge[t2][t1] = t3;
}
}
int spfa ( int x )
{
for ( int i = 1;i <= n;i++ )
{
book[i] = 0;
dis[i] = inf;
}
q.push(x);
book[x] = 1;
dis[x] = 0;
while ( !q.empty() )
{
int cur = q.front();
q.pop();
for ( int i = 1;i <= n;i++ )
{
if ( dis[i] > dis[cur] + edge[cur][i] )
{
dis[i] = dis[cur] + edge[cur][i];
if ( book[i] == 0 )
{
book[i] = 1;
q.push(i);
}
}
}
book[cur] = 0;
}
return dis[n];
}
int main(void)
{
while ( cin>>n>>m )
{
if ( n==0&&m==0 )
break;
init();
input();
ans = spfa( 1 );
printf("%d\n",ans);
}
return 0;
}