ZOJ 1221 Risk

來源:互聯網
上載者:User

這個算是圖論裡面的簡單題了,可以用floyd,dijkstra,bfs去做,,只當練手。。

 

 

 

floyd做。。

#include<stdio.h> #include<string.h> #include<stdlib.h> int mat[21][21]; const int INF = 99999; int main(void) { int n,from,to,t; int i,j,k,start=1; while( scanf("%d",&n) != EOF ) { for( i = 1; i <= 20; i++ ) for( j = 1; j <= 20; j++ ) mat[i][j] = INF; while( n-- ) { scanf("%d",&to); mat[1][to] = 1; mat[to][1] = 1; } for( i = 2;i <= 19;i++) { scanf("%d",&n); while( n-- ) { scanf("%d",&to); mat[i][to] = 1; mat[to][i] = 1; } } for( k = 1; k <= 20; k++ ) for( i = 1; i <= 20; i++ ) for( j = 1; j <= 20; j++ ) if( mat[i][j] > mat[i][k] + mat[k][j] ) mat[i][j] = mat[i][k] + mat[k][j]; scanf("%d",&n); printf("Test Set #%d/n",start++); while( n-- ) { scanf("%d%d",&from,&to); printf("%d to %d: %d/n",from,to,mat[from][to]); } printf("/n"); } return 0; }

 

 

用dijkstra:

#include<stdio.h> #include<string.h> #include<stdlib.h> int mat[21][21]; int flag[21]; int dist[21]; const int INF = 99999999; int main(void) { int n,from,to,min,now; int i,j,k,start=1; while( scanf("%d",&n) != EOF ) { for( i = 1; i <= 20; i++ ) for( j = 1; j <= 20; j++ ) mat[i][j] = INF; while( n-- ) { scanf("%d",&to); mat[1][to] = 1; mat[to][1] = 1; } for( i = 2;i <= 19;i++) { scanf("%d",&n); while( n-- ) { scanf("%d",&to); mat[i][to] = 1; mat[to][i] = 1; } } scanf("%d",&n); printf("Test Set #%d/n",start++); while( n-- ) { scanf("%d%d",&from,&to); for( i = 1;i<=20;i++ ) dist[i]=INF; memset(flag,0,sizeof(flag)); flag[from] = 1;dist[now=from]=0; for( i = 1; i < 20; i++) { for( j = 1; j <= 20; j++ ) if( !flag[j] && dist[j] > dist[now] + mat[now][j] ) dist[j] = dist[now] + mat[now][j]; for( j = 1,min = INF; j <= 20; j++ ) if( !flag[j] && dist[j] < min ) min = dist[now=j]; flag[now]=1; } printf("%d to %d: %d/n",from,to,dist[to]); } printf("/n"); } return 0; }

 

bfs:

#include<stdio.h> #include<string.h> #include<stdlib.h> int mat[21][21]; int q[100],flag[21],dist[21]; int front=0,back=0; const int INF = 99999999; int main(void) { int n,from,to; int i,j,t,start=1; while( scanf("%d",&n) != EOF ) { for( i = 1; i <= 20; i++ ) for( j = 1; j <= 20; j++ ) mat[i][j] = INF; while( n-- ) { scanf("%d",&to); mat[1][to] = 1; mat[to][1] = 1; } for( i = 2;i <= 19;i++) { scanf("%d",&n); while( n-- ) { scanf("%d",&to); mat[i][to] = 1; mat[to][i] = 1; } } scanf("%d",&n); printf("Test Set #%d/n",start++); while( n-- ) { scanf("%d%d",&from,&to); front = back = 0; for( i = 1;i<=20;i++ ) flag[i] = 0; q[back++] = from; flag[from] = 1; dist[from] = 0; while( back!=front ) { t = q[front++]; for( i = 1;i <=20;i++) if( !flag[i] && mat[t][i] == 1 ) { dist[i] = dist[t] + 1; flag[i] = 1; q[back++] = i; } } printf("%d to %d: %d/n",from,to,dist[to]); } printf("/n"); } return 0; }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.