繼續最短路模板題額。。
只是多了一個條件就是有些路是已經修好的,那麼只要把修好的路之間的距離設爲0,再Dijkstra一遍就出答案~
Constructing
Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.
Input
Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.
Output
Sample Input
3 0 990 692 990 0 179 692 179 0 1 1 2
Sample Output
179
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define MAX 105
#define inf 0x7f7f7f
int n,m;
int mp[MAX][MAX];
int dis[MAX];
bool visit[MAX];
void prim( int st )
{
for( int i=1 ; i<=n ; i++ ){
visit[i] = false;
dis[i] = mp[st][i];
}
visit[st] = true;
dis[st] = 0;
int ans = 0;
int tmp,k;
for( int i=1 ; i<n ; i++ ){
tmp = inf;
for( int j=1 ; j<=n ; j++ )
if( !visit[j] && tmp > dis[j] )
tmp = dis[ k = j ];
ans += tmp;
visit[k] = true;
for( int j=1 ; j<=n ; j++ )
if( !visit[j] && dis[j] > mp[k][j] )
dis[j] = mp[k][j];
}
printf("%d\n",ans);
}
int main()
{
while( scanf("%d",&n) == 1 ){
for( int i=1 ; i<=n ; i++ )
for( int j=1 ; j<=n ; j++ )
scanf("%d",&mp[i][j]);
scanf("%d",&m);
int a,b;
for( int i=1 ; i<=m ; i++ ){
scanf("%d%d",&a,&b);
mp[a][b] = mp[b][a] = 0 ;
}
prim( 1 );
}
return 0;
}