您的位置:首页 > 其它

UVA 567 最短路水题

2013-09-27 20:28 453 查看
汝佳大神小白书的一道图论水题

点就20个,数据非常水

这道题最靓的点是数据输出格式要左对齐,还好数据小

dijkstra floyd啥的都可以随便水过

#include <cstdio>
#include <cstring>
#define MAX 5000000
int S[25][25], d[25];
bool vis[25];
int fst, nd, q, st, ed, it;
int main()
{
//freopen("1.txt", "r", stdin);
it = 0;
while(scanf("%d", &fst) != EOF)
{
it++;
printf("Test Set #%d\n", it);
memset(S, 0, sizeof(S));
for(int i = 1; i <= fst; i++)
{
scanf("%d", &nd);
S[1][nd] = S[nd][1] = 1;
}
for(int i = 2; i <= 19; i++)
{
scanf("%d", &fst);
for(int j = 1; j <= fst; j++)
{
scanf("%d", &nd);
S[i][nd] = S[nd][i] = 1;
}
}
scanf("%d", &q);
for(int i = 1; i <= q; i++)
{
memset(vis, 0, sizeof(vis));
for(int j = 1; j <= 20; j++) d[j] = MAX;
scanf("%d%d", &st, &ed);
d[st] = 0;
for(int j = 1; j <= 20; j++)
{
int mi = MAX; nd = 0;
for(int k = 1; k <= 20; k++)
if(!vis[k] && d[k] < mi)
{
mi = d[k]; nd = k;
}
if(!nd) break;
vis[nd] = true;
for(int k = 1; k <= 20; k++)
if(!vis[k] && S[nd][k]
&& d[k] > d[nd] + S[nd][k])
d[k] = d[nd] + S[nd][k];
}

if(st < 10) printf(" %d", st);
else printf("%d", st);
printf(" to ");
if(ed < 10) printf(" %d:", ed);
else printf("%d:", ed);
if(d[ed] < 10) printf(" %d", d[ed]);
else printf("%d", d[ed]);
printf("\n");
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: