33,027
社区成员




/*
ID:fuxiang2
PROG: butter
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <list>
#include <algorithm>
#include <set>
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;
ofstream fout ("butter.out");
ifstream fin ("butter.in");
const int N = 802;
int maxN = 0x0fffffff;
int graph[N][N];
int d[N];
int cow[N];
int flag[N] ;
int n,p,c;
//bool queue_find(queue<int > q,int key)
//{
// while(!q.empty() ){
// int num = q.front();
// q.pop();
//
// if(num == key )
// return true;
// }
//
// return false;
//}
void spfa(int start)
{
queue<int > q;
q.push(start);
//初始化距离
for(int i = 1 ; i <= p ; i ++)
d[i] = maxN;
d[start] = 0;
memset(flag,N*sizeof(int),0);
flag[start] = 1;
while(!q.empty()){
int u = q.front();
q.pop();
flag[u] = 0;
for(int v = 1 ; v <= p ; v ++){
//if(u != v && graph[u][v] ){
if( d[v] > graph[u][v] + d[u] ){
d[v] = graph[u][v] + d[u];
//if(queue_find(q ,v) == false){
if( flag[v] == 0){
q.push(v);
flag[v] = 1;
}
}
// }// end if
}//end for
}//end while
}
int main()
{
fin>>n>>p>>c;
for(int i = 1; i <= n ; i ++){
int a;
fin>>a;
cow[a] ++;
}
// for(int i =1 ; i < N ; i ++){
// for(int j = 1 ; j < N ; j ++)
// graph[i][j] = maxN;
// }
for(int i = 1 ; i <= c ; i ++){
int x,y,w;
fin>> x>>y >>w;
graph[x][y] = graph[y][x] = w;
}
long minN = maxN;
for(int i = 1 ; i <= p ; i ++){
spfa(i);
long t = 0;
for(int j = 1 ; j <= p ; j ++){
if (d[j] == maxN) {
t = maxN;
break;
}
t += cow[j]*d[j];
}
if (t < minN) minN = t;
}
fout<< minN <<endl;
return 0;
}
#include<fstream>
#include<cstring>
#include<queue>
using namespace std;
const int MAX=805;
const int INF=0x0fffffff;
ifstream fin("butter.in");
ofstream fout("butter.out");
struct node{
int end,len;
};
int cnt[MAX]={0},location[505]={0},n,p,c;
node adj[MAX][MAX];
bool in[MAX]={0};
int d[MAX];
int SPFA(int i)
{
memset(in,0,sizeof in);
for(int k=1; k<=p; k++)d[k]=INF;
queue<int> Q;
Q.push(i);
in[i]=true;
d[i]=0;
while(!Q.empty())
{
int x=Q.front(); Q.pop();
in[x]=false;
for(int j=0; j<cnt[x]; j++)
if(d[x]+adj[x][j].len < d[ adj[x][j].end ])
{
d[adj[x][j].end]=d[x]+adj[x][j].len;
if(!in[adj[x][j].end])
{
Q.push(adj[x][j].end);
in[adj[x][j].end ]=true;
}
}
}
int ans=0;
for(int j=1; j<=n; j++)
{
if(d[location[j]]==INF)return -1;
else ans+=d[location[j]];
}
return ans;
}
void print()
{
int i,j;
for(i=1; i<=p ; i++)
for(j=0; j<cnt[i]; j++)
{
fout<<i<<' '<<adj[i][j].end<<' '<<adj[i][j].len<<endl;
}
}
int main()
{
memset(cnt,0,sizeof cnt);
fin>>n>>p>>c;
for(int i=1; i<=n; i++)
fin>>location[i];
for(int i=1,s,t,value; i<=c; i++)
{
fin>>s>>t>>value;
adj[s][cnt[s]].end=t; adj[s][cnt[s]].len=value; cnt[s]++;
adj[t][cnt[t]].end=s; adj[t][cnt[t]].len=value; cnt[t]++;
}
int tt,min=INF;
for(int i=1; i<=p; i++)
{
tt=SPFA(i);
if(tt<min&&tt!=-1) min=tt;
}
fout<<min<<endl;
//system("pause");
return 0;
}
memset(flag,N*sizeof(int),0);