//ylwh 2607 Accepted 1356K 1047MS G++ 1520B 2011-08-08 20:22:30【SFPA】
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define N 505
#define MAX 200000000
int main()
{
int nf, ni, ans, len;
int staue[N], flag[N], Q[N], d[N], map[N][N];
int i, j, k, temp, maxs, head, tail, now;
char s[20];
while(scanf("%d%d", &nf, &ni) != EOF)
{
ans = 1;
len = MAX;
memset(map, 0, sizeof(map));
memset(flag, 0, sizeof(flag));
for(i=1; i<=nf; i++)
{
scanf("%d", &k);
map[0][k] = 1;
flag[k]++;
}
getchar();
while(gets(s) && strlen(s) > 1)
{
sscanf(s,"%d%d%d", &i, &j, &k);
map[i][j] = map[j][i] = k;
}
for(i=1; i<=ni; i++)
{
if( !flag[i])
{
for(j=1; j<=ni; j++)
d[j] = MAX;
map[0][i] = 1;
memset(staue, 0, sizeof(staue));
head = 0;
tail = 1;
Q[head] = 0;
staue[0] = 1;
d[0] = -1;
while(head != tail)
{
now = Q[head];
for(j=1; j<=ni; j++)
{
if(map[now][j] && d[j] > map[now][j] + d[now])
{
if( !staue[j])
{
Q[tail++] = j;
staue[j] = 1;
tail %= ni + 5;
}
d[j] = map[now][j] + d[now];
}
}
staue[now] = 0;
head = (head + 1) % (ni + 5);
}
maxs = 0;
for(j=1; j<=ni; j++)
{
if(d[j] > maxs)
maxs = d[j];
}
if(maxs < len)
{
len = maxs;
ans = i;
}
map[0][i] = 0;
}
}
printf("%d\n", ans);
}
return 0;
}
继续改写中。。。。。。。
改写后版本:
//2619852 2011-08-08 20:33:40 Accepted 1857 C 50 160 ylwh!
//9111412 ylwh 2607 Accepted 1364K 47MS G++ 1977B 2011-08-08 20:34:31
#include <stdio.h>
#include <string.h>
#define N 505
#define MAX 200000000
int main()
{
int nf, ni, ans, len;
int staue[N], flag[N], Q[N], d[N], map[N][N];
int i, j, k, temp[N], maxs, head, tail, now;
char s[20];
while(scanf("%d%d", &nf, &ni) != EOF)
{
ans = 1;
len = MAX;
memset(map, 0, sizeof(map));
memset(flag, 0, sizeof(flag));
for(i=1; i<=nf; i++)
{
scanf("%d", &k);
map[0][k] = 1;
flag[k]++;
}
getchar();
while(gets(s) && strlen(s) > 1)
{
sscanf(s,"%d%d%d", &i, &j, &k);
map[i][j] = map[j][i] = k;
}
for(j=1; j<=ni; j++)
temp[j] = MAX;
memset(staue, 0, sizeof(staue));
head = 0;
tail = 1;
Q[head] = 0;
staue[0] = 1;
temp[0] = -1;
while(head != tail)
{
now = Q[head];
for(j=1; j<=ni; j++)
{
if(map[now][j] && temp[j] > map[now][j] + temp[now])
{
if( !staue[j])
{
Q[tail++] = j;
staue[j] = 1;
tail %= ni + 5;
}
temp[j] = map[now][j] + temp[now];
}
}
staue[now] = 0;
head = (head + 1) % (ni + 5);
}
maxs = 0;
for(i=1; i<=ni; i++)
{
if( !flag[i])
{
for(j=0; j<=ni; j++)
d[j] = temp[j];
map[0][i] = 1;
memset(staue, 0, sizeof(staue));
head = 0;
tail = 1;
Q[head] = 0;
staue[0] = 1;
while(head != tail)
{
now = Q[head];
for(j=1; j<=ni; j++)
{
if(map[now][j] && d[j] > map[now][j] + d[now])
{
if( !staue[j])
{
Q[tail++] = j;
staue[j] = 1;
tail %= ni + 5;
}
d[j] = map[now][j] + d[now];
}
}
staue[now] = 0;
head = (head + 1) % (ni + 5);
}
maxs = 0;
for(j=1; j<=ni; j++)
{
if(d[j] > maxs)
maxs = d[j];
}
if(maxs < len)
{
len = maxs;
ans = i;
}
map[0][i] = 0;
}
}
printf("%d\n", ans);
}
return 0;
}
继续改写中(邻接表, T_T, 对于我很难写啊。。。。。。
//2620886 2011-08-09 21:43:57 Accepted 1857 C 0 276 ylwh!
#include <stdio.h>
#include <string.h>
#define N 505
#define MAX 200000000
struct edge
{
int num, len;
struct edge * next;
}e[10005];
int main()
{
int nf, ni, ans, len;
int staue[N], flag[N], d[N], Q[N+5];
int i, j, k, temp[N], maxs, now, head, tail;
struct edge * next;
char s[20];
while(fscanf(stdin, "%d%d", &nf, &ni) != EOF)
{
ans = 1;
len = MAX;
for(j=1; j<=ni; j++)
temp[j] = MAX;
memset(staue, 0, sizeof(staue));
memset(flag, 0, sizeof(flag));
for(i=1; i<=ni; i++)
{
e[i].num = i;
e[i].next = NULL;
}
head = -1;
for(i=1; i<=nf; i++)
{
fscanf(stdin, "%d", &k);
flag[k]++;
temp[k] = 0;
staue[k] = 1;
Q[++head] = k;
}
tail = head + 1;
head = ni;
getchar();
while(fgets(s, 20, stdin) && strlen(s) > 1)
{
sscanf(s,"%d%d%d", &i, &j, &k);
e[++head].num = j;
e[head].len = k;
e[head].next = e[i].next;
e[i].next = e + head;
e[++head].num = i;
e[head].len = k;
e[head].next = e[j].next;
e[j].next = e + head;
}
head = 0;
while(head != tail)
{
now = Q[head];
next = e[now].next;
while(next != NULL)
{
if(temp[ next->num ] > temp[now] + next->len)
{
temp[ next->num ] = temp[now] + next->len;
if( !staue[next->num])
{
Q[tail++] = next->num;
staue[ next->num] = 1;
tail %= ni + 5;
}
}
next = next->next;
}
head++;
head %= ni + 5;
}
for(i=1; i<=ni; i++)
{
if( !flag[i] )
{
for(j=1; j<=ni; j++)
d[j] = temp[j];
memset(staue, 0, sizeof(staue));
tail = 1;
head = 0;
Q[head] = i;
staue[i] = 1;
d[i] = 0;
while(head != tail)
{
now = Q[head];
next = e[now].next;
while(next != NULL)
{
if(d[ next->num ] > d[now] + next->len)
{
d[ next->num ] = d[now] + next->len;
if( !staue[next->num])
{
Q[tail++] = next->num;
staue[ next->num] = 1;
tail %= ni + 5;
}
}
next = next->next;
}
head++;
head %= ni + 5;
}
maxs = 0;
for(j=1; j<=ni; j++)
if(d[j] > maxs)
maxs = d[j];
if(maxs < len)
{
len = maxs;
ans = i;
}
}
}
printf("%d\n", ans);
}
return 0;
}