POJ 1125 Stockbroker Grapevine 最短路水题floyd || dijkstra
水题一枚
数据规模不是很大,可以用floyd暴力过
View Code
#include<stdio.h> #include<string.h> #define INF 30 #define maxn 101 int dis[maxn][maxn]; int n, m; void floyd() { int i, j, k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(k!=i&&k!=j) if(dis[i][k]+dis[k][j] < dis[i][j]) dis[i][j]= dis[i][k] + dis[k][j]; int min = INF,max, v=-1; for(i=1;i<=n;i++) { max = -1; for(j=1;j<=n;j++) if(max < dis[i][j]&&i!=j) max = dis[i][j]; if(max < min) { min = max; v = i; } } if(v == -1)puts("disjoint"); else printf("%d %d\n",v, min); } int main() { int i ,j,y, w; while(~scanf("%d",&n)&&n) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) dis[i][j]=INF; for(i=1;i<=n;i++) { scanf("%d",&m); while(m--) { scanf("%d%d",&y,&w); if(dis[i][y] > w)dis[i][y] = w; } } floyd(); } return 0; }
dijstra也能过
View Code
#include<stdio.h> #include<string.h> #define maxn 1001 #define INF 20 int dis[maxn],adj[maxn][maxn]; bool vis[maxn]; int m, n; int dijkstra(int v) { int i ,j ,k, u, min; for(i=0;i<=n;i++) { dis[i]=adj[v][i]; vis[i]=0; } vis[v]=1;dis[v]=0; for(i=1;i<n;i++) { min =INF; for(j=1;j<=n;j++) { if(min > dis[j]&&!vis[j]) { min = dis[j]; u = j; } } if(min == INF)break; vis[u] = 1; for(j=1;j<=n;j++) { if(!vis[j]&&dis[u]+adj[u][j] < dis[j]) { dis[j] = dis[u] +adj[u][j]; } } } return min; } int main() { int y, w,i,j; while(~scanf("%d",&n)&&n) { for(i=0;i<=n;i++) { for(j=0;j<=n;j++) adj[i][j] = INF; } for(i=1;i<=n;i++) { scanf("%d",&m); while(m--) { scanf("%d%d",&y,&w); if(adj[i][y] > w)adj[i][y]=w; } } int min =INF,num; for(i=1;i<=n;i++) { int temp = dijkstra(i); if(temp < min) { min = temp; num = i; } } if(min == INF)puts("disjoint"); else printf("%d %d\n",num, min); } return 0; }


浙公网安备 33010602011771号