#include<stdio.h>
#include<string.h>
#define INF 0x1f1f1f1f
#define M 602
int map[M][M],dis[M],team[M];
bool flag[M];
void dijkstra(int s,int n)
{
int i,j,k,md,temp;
memset(dis,0x1f,sizeof(dis));
memset(flag,false,sizeof(flag));
dis[s]=0;
for(i=1;i<n;i++)
{
md=INF;
for(j=1;j<=n;j++)
{
if(!flag[j]&&dis[j]<md)
{
md=dis[j];
temp=j;
}
}
if(temp==2) break;
flag[temp]=true;
for(j=1;j<=n;j++)
if(!flag[j]&&map[temp][j]+md<dis[j])
dis[j]=md+map[temp][j];
}
if(dis[2]<map[1][1])printf("%d\n",dis[2]);
else printf("-1\n");
}
int main()
{
int i,j,k,n,m,p,q;
while(scanf("%d",&n),n)
{
scanf("%d",&m);
memset(map,0x1f,sizeof(map));
for(j=1;j<=m;j++)
{
scanf("%d%d%d",&p,&q,&k);
map[p][q]=map[q][p]=k;
}
for(j=1;j<=n;j++)
scanf("%d",&team[j]);
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
if(team[i]==team[j]) //濡傛灉鏄竴涓猤roup錛屼笉鐢ㄧ
continue;
else if(team[i]==1&&team[j]==2) //濡傛灉涓涓槸1涓涓槸2錛屽垯寤哄崟鍚戣竟
map[j][i]=map[1][1];
else if(team[i]==2&&team[j]==1) //鍚屼笂
map[i][j]=map[1][1];
}
dijkstra(1,n);
}
}
1#include<stdio.h>
2#include<string.h>
3#include<stdlib.h>
4#define INF 0x1f1f1f1f
5#define M 102
6int map[M][M],dis[M];
7bool flag[M];
8int prim(int s,int n)
{
9int i,j,md,temp,total=0;
10memset(flag,false,sizeof(flag));
11flag[s]=true;
12for(i=1;i<=n;i++)
13dis[i]=map[s][i];
14for(i=1;i<n;i++)
{
15md=INF;
16for(j=1;j<=n;j++)
{
17if(!flag[j]&&dis[j]<md)
{
18temp=j;
19md=dis[j];
20}
21}
22total+=md;
23flag[temp]=true;
24for(j=1;j<=n;j++)
25if(!flag[j]&&map[temp][j]<dis[j])
26dis[j]=map[temp][j];
27}
28return total;
29}
30int main()
31{
32int i,j,k,n,cas;
33while(scanf("%d",&n)!=EOF)
{
34for(i=1;i<=n;i++)
35for(j=1;j<=n;j++)
{
36scanf("%d",&map[i][j]);
37if(map[i][j]==0) map[i][j]=INF;
38}
39printf("%d\n",prim(1,n));
40//system("PAUSE");
41}
42}
1#include<stdio.h>
2#include<string.h>
3#include<stdlib.h>
4#define INF 0x1f1f1f1f
5#define M 102
6int map[M][M],dis[M];
7bool flag[M];
8int prim(int s,int n)
{
9int i,j,md,temp,total=0;
10memset(flag,false,sizeof(flag));
11memset(dis,0x1f,sizeof(dis));
12dis[s]=0;
13for(i=1;i<=n;i++)
{
14md=INF;
15for(j=1;j<=n;j++)
{
16if(!flag[j]&&dis[j]<md)
{
17temp=j;
18md=dis[j];
19}
20}
21total+=md;
22flag[temp]=true;
23for(j=1;j<=n;j++)
24if(!flag[j]&&map[temp][j]<dis[j])
25dis[j]=map[temp][j];
26}
27return total;
28}
29int main()
30{
31int i,j,k,n,cas;
32while(scanf("%d",&n)!=EOF)
{
33for(i=1;i<=n;i++)
34for(j=1;j<=n;j++)
35scanf("%d",&map[i][j]);
36printf("%d\n",prim(1,n));
37}
38}
39