百年来,人活着是为了什么这个问题一直萦绕在人的脑海里,也一直困扰着人的思想。人活着就是活着了,为活着本身而活着,而不是为活着之外的任何事物而活着的。正因为活着,所以活着。对,是有点莫明其妙,但也是一句最受用的话。
芳姐特别喜欢猪,所以,她特意养了n头猪,建了m个猪圈,顺便在m个猪圈间修了k条无向边,每条边有都有起点u,终点v,距离w。每头猪呆在一个特定的猪圈,有一个问题一直困扰着芳姐,那就是喂猪.....芳姐和猪们约定好,每天去一个固定猪圈去吃饭,芳姐为了不累着她可爱的猪们,想知道所有的猪吃饭走的最短路程是多少?
第二行到第N+1行: 1到N头猪所在的猪圈号.
第n+2行到第n+k+1行: 每行有三个数:相连的猪圈u、v,两猪圈间距离(1<=w<=255)
注:有的猪圈可能是空的,也可能有多头猪,保证m个猪圈连通。
3 4 5 2 3 4 1 2 1 1 3 5 2 3 7 2 4 3 3 4 5
8
Dijkstra + 优先队列
#include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; struct node { int v,w,next; } ls[360001]; int Pigsty[601]; int head[601]; int zd[610][610]; bool vis[610]; int num; void Add(int x,int y,int z) { ls[num].v = y; ls[num].w = z; ls[num].next = head[x]; head[x] = num++; } void Dijkstra(int s,int m) { int t; queue<int >q; memset(vis,false,sizeof(vis)); for(int i=0; i<=m; i++) { zd[s][i] = INF; } zd[s][s] = 0; vis[s] = true; q.push(s); while(!q.empty()) { t = q.front(); q.pop(); int x = t; for(int i=head[x]; ~i; i = ls[i].next) { int y = ls[i].v; if(zd[s][y] > zd[s][x] + ls[i].w) { zd[s][y] = zd[s][x] + ls[i].w; if(!vis[y]) { vis[y] = true; q.push(y); } } } vis[x] = false; } } int main() { //freopen("in.txt","r",stdin); int n,m,k; while(cin>>n>>m>>k) { int nn = INF; num = 0; memset(Pigsty,0,sizeof(Pigsty)); memset(head,-1,sizeof(head)); int Pig; for(int i=0; i<n; i++) { cin>>Pig; Pigsty[Pig]++; } for(int i=0; i<k; i++) { int x,y,z; cin>>x>>y>>z; Add(x,y,z); Add(y,x,z); } for(int i=1; i<=m; i++) { Dijkstra(i,m); } int sum; for(int i=1; i<=m; i++) { sum = 0; for(int j=1; j<=m; j++) { if(Pigsty[j]) { sum += Pigsty[j] * zd[i][j]; } } if(sum < nn) nn = sum; } printf("%d\n",nn); } return 0; }
#include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int dis[610][610]; void Floyd(int m) { for(int k=1;k<=m;k++) { for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++) { dis[i][j] = dis[i][j] < dis[i][k]+dis[k][j] ? dis[i][j] : dis[i][k] + dis[k][j]; } } } } int main() { //freopen("in.txt","r",stdin); int s[610]; int n,m,k; cin>>n>>m>>k; for(int i=0;i<n;i++) cin>>s[i]; for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++) { if(i!=j) dis[i][j] = INF; else dis[i][j] = 0; } } for(int i=0;i<k;i++) { int u,v,w; cin>>u>>v>>w; if(dis[u][v] > w) { dis[u][v] = w; dis[v][u] = w; } } int MIN = INF; Floyd(m); for(int i=1;i<=m;i++) { int sum = 0; for(int j=0;j<n;j++) { sum += dis[i][s[j]]; } if(sum < MIN) MIN = sum; } cout<<MIN<<endl; return 0; }