zoj1092
#include <stdio.h>
#include <string.h>
#include <math.h>
#define zero 0.000001
int main()
{
char name[30][300];
char from[300], to[300];
double g[30][30];
double rate;
int flag;
int i,j,k;
int n,m;
int cases = 1;
while(scanf("%d", &n) && n)
{
memset(g, 0, sizeof(g));
for(i=0; i<n; i++)
scanf("%s", name[i]);
scanf("%d", &m);
for(i=0; i<m; i++)
{
scanf("%s%lf%s",from, &rate, to);
for(j=0; j<30; j++)
if (strcmp(from,name[j])==0) break;
for(k=0; k<30; k++)
if (strcmp(to,name[k])==0) break;
g[j][k] = log(rate);
}
for(k=0; k<n; k++)
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
rate = g[i][k]+g[k][j];
if(g[i][j]<rate) g[i][j] = rate;
}
flag = 0;
for(i=0; i<n; i++)
if (g[i][i]>zero) flag = 1;
printf("Case %d: ", cases++);
printf("%s\n", flag ? "Yes" : "No");
}
return 0;
}
zoj1117
#include <stdio.h>
#include <string.h>
struct {
int lchild, rchild, parent;
}tree[64];
char text[100];
int freq[64];
int optimal;
void entropy(int n, int d)
{
if(freq[n]==0) return;
if(n<31) optimal += freq[n]*d;
else
{
entropy(tree[n].lchild, ++d);
entropy(tree[n].rchild, d);
}
}
int main()
{
int i,j;
int left,right;
while(gets(text))
{
if (strcmp(text,"END")==0) break;
int length = strlen(text);
memset(tree, 255, sizeof(tree));
memset(freq, 0, sizeof(freq));
for(i = 0; i<length; i++)
if (text[i]=='_') freq[26]++;
else freq[text[i]-'A']++;
int node = 30;
while(1)
{
int min = 1000;
for(j = 0; j<=node; j++)
if(tree[j].parent==-1)
if(min>freq[j] && freq[j])
{
min = freq[j];
left = j;
}
min = 1000;
for(j = 0; j<=node; j++)
if(tree[j].parent==-1)
if(j!=left && min>freq[j] && freq[j])
{
min = freq[j];
right = j;
}
if (min==1000) break;
freq[++node] = freq[left] + freq[right];
tree[node].lchild = left;
tree[node].rchild = right;
tree[node].parent = -1;
tree[left].parent = node;
tree[right].parent = node;
}
optimal = 0;
if(node==30) optimal = length;
else entropy(node,0);
length *= 8;
printf("%d %d %.1lf\n", length, optimal, 1.0*length/optimal);
}
return 0;
}
zoj1118
#include<iostream>
#include<map>
using namespace std;
map<string,int> maps;
int set[200];
int findhead(int number)
{
if(set[number]==number) return number;
else
{
set[number] = findhead(set[number]);
return set[number];
}
}
int build(char path[], int &count)
{
int index;
if(maps.find(string(path))==maps.end())
{
maps[string(path)] = ++count;
index = count;
set[count] = count;
}
else index = maps[string(path)];
return index;
}
int main()
{
int n;
int number = 1;
while(scanf("%d",&n) && n)
{
int i;
int p;
char starting[15], ending[15];
for(i = 0; i<n; i++)
{
scanf("%d", &p);
starting[i] = p+'0';
}
starting[n] = 0;
for(i = 0; i<n; i++)
{
scanf("%d", &p);
ending[i] = p+'0';
}
ending[n] = 0;
int count = 0;
maps.clear();
char path[15];
while(scanf("%d", &p))
{
if(p==-1) break;
int start, end;
path[0] = p+'0';
for(i = 1; i<n; i++)
{
scanf("%d", &p);
path[i] = p+'0';
}
path[n] = 0;
start = build(path, count);
for(i = 0; i<n; i++)
{
scanf("%d", &p);
path[i] = p+'0';
}
path[n] = 0;
end = build(path, count);
int h1 = findhead(start);
int h2 = findhead(end);
if(h1!=h2) set[h1] = h2;
}
int possible = 1;
if(maps.find(string(starting))==maps.end()
|| maps.find(string(ending))==maps.end())
possible = 0;
else
{
int start = maps[string(starting)];
int end = maps[string(ending)];
int h1 = findhead(start);
int h2 = findhead(end);
if(h1!=h2) possible = 0;
}
if (possible) printf("Maze #%d can be travelled\n",number++);
else printf("Maze #%d cannot be travelled\n",number++);
}
return 0;
}
zoj1119
#include<stdio.h>
#include<memory.h>
const int Node = 1000;
int n;
bool G[Node][Node];
int father[Node];
int order[Node];
int low[Node];
bool visited[Node];
void DFS(int v, int d)
{
if (visited[v]) return;
low[v] = d;
order[v] = d;
visited[v] = true;
for (int i = 0; i < n; i++) {
if (G[v][i]) {
if (visited[i])
low[v] = low[v]<order[i]?low[v]:order[i];
else {
father[i] = v;
DFS(i, d+1);
low[v] = low[v]<low[i]?low[v]:low[i];
}
}
}
}
void SPF()
{
for (int i = 0; i < n; i++)
{
visited[i] = false;
father[i] = -1;
low[i] = 0;
order[i] = 0;
}
for (int i = 0; i < n; i++)
if (!visited[i]) DFS(i, 1);
bool find = false;
for (int i = 0; i < n; i++)
{
int subnet = 0;
for (int j = 0; j < n; j++)
if ((father[j] == i) && (low[j] >= order[i]))
subnet++;
if (subnet > 0) {
if (father[i] == -1) {
if (subnet > 1) {
find = true;
printf(" SPF node %d leaves %d subnets\n", i+1, subnet);
}
}
else {
find = true;
printf(" SPF node %d leaves %d subnets\n", i+1, subnet+1);
}
}
}
if (!find) {
printf(" No SPF nodes\n");
}
}
int main(){
int i,j;
int number = 0;
memset(G, 0, sizeof(G));
while(scanf("%d", &i)) {
if(i==0) {
if(number) putchar('\n');
printf ("Network #%d\n", ++number);
SPF();
scanf("%d", &i);
if (i==0) break;
memset(G, 0, sizeof(G));
}
n = -1;
scanf("%d", &j);
if(i>n) n = i;
if(j>n) n = j;
G[i-1][j-1] = G[j-1][i-1]=1;
}
}
zoj1127
#include <stdio.h>
#include <memory.h>
int city;
char graph [26][26];
char fortify [26];
int Dijkstra()
{
int i, j, k;
int searched [26];
int hop [26];
for ( i = 0; i < city; i ++ )
if ( fortify [i] ) hop [i] = 0;
else hop [i] = 100;
memset(searched, 0, sizeof(searched));
for ( i = 0; i < city; i ++ ) {
k = -1;
for ( j = 0; j < city; j ++ )
if ( !searched [j] )
if ( k < 0 || hop [j] < hop [k] ) k = j;
if ( k < 0 ) break;
searched [k] = 1;
for ( j = 0; j < city; j ++ )
if (!searched [j])
if ( graph [k][j] && hop [k] + 1 < hop [j] )
hop [j] = hop [k] + 1;
}
j = -1;
for ( i = 0; i < city; i ++ )
if ( !fortify [i] )
if ( j < 0 || hop [j] < hop [i] ) j = i;
fortify [j] = 1;
return j;
}
int main ()
{
int i;
int total;
char first, str[10];
char a , b;
scanf("%d%s%d\n", &city, str, &total);
first = str[0];
memset (fortify, 0, sizeof(fortify));
memset (graph, 0, sizeof(graph));
for ( i = 1; i < city; i ++ )
{
scanf("%c %c\n", &a, &b);
graph[a-'A'][b-'A'] = 1;
graph[b-'A'][a-'A'] = 1;
}
fortify [first - 'A'] = 1;
printf("Program 8 by team X\n");
printf("%c", first);
for (i = 1; i < total; i ++ )
printf(" %c", Dijkstra() + 'A');
printf("\n");
printf("End of program 8 by team X\n");
return 0;
}
zoj1134
#include <stdio.h>
#include <string.h>
#define maxV 1501
int pos[maxV];
int size[maxV];
int f1[maxV], f2[maxV];
struct Edge
{
int x, y;
}edge[maxV];
void dp( int now )
{
f1[now] = 1;
f2[now] = 0;
if (size[now]==0) return;
int v;
int i = pos[now];
while(edge[i].x ==now)
{
v = edge[i++].y;
dp( v );
f1[now] += f1[v]<f2[v]?f1[v]:f2[v];
f2[now] += f1[v];
}
}
int main()
{
int i, j;
int u, v, num;
int node, leaf;
int V;
while( scanf("%d", &V )!=EOF )
{
int idx = 1;
node = leaf = 0;
for( i=1; i<=V; i++ )
{
scanf("%d:(%d)", &u, &num );
node +=u;
pos[u] = idx;
size[u] = num;
for( j=1; j<=num; j++ )
{
scanf("%d", &v );
leaf +=v;
edge[idx].x = u;
edge[idx++].y = v;
}
}
int root = node-leaf;
dp(root);
printf("%d\n", f1[root]<f2[root]?f1[root]:f2[root]);
}
return 0;
}
zoj1137
#include<stdio.h>
#include<memory.h>
#define M 500
int n,m;
int match[M];
char used[M];
int g[M][20];
int dfs(int stu)
{
int i;
int x, t;
for(i=1; i<=g[stu][0]; i++)
{
x = g[stu][i];
if(!used[x])
{
used[x] = 1;
t = match[x];
match[x] = stu;
if(t==-1||dfs(t)) return 1;
match[x] = t;
}
}
return 0;
}
int bipartite()
{
int stu;
int res = 0;
memset(match, -1, sizeof(match));
for(stu=0; stu<n; stu++)
{
memset(used, 0, sizeof(used));
if(dfs(stu)) res++;
}
return res;
}
int main()
{
int i, j;
int a, b;
while(scanf("%d",&n)!=EOF)
{
memset(g, 0, sizeof(g));
for(i=0; i<n; i++)
{
scanf("%d: (%d)", &a, &m);
g[a][0] = m;
for(j=1; j<=m; j++)
{
scanf("%d", &b);
g[a][j] = b;
}
}
printf("%d\n",n-bipartite()/2);
}
return 0;
}
zoj1140
#include <stdio.h>
#include <memory.h>
#define MAXN 301
int match[MAXN];
int used[MAXN];
int g[MAXN][120];
int dfs(int course){
int x, t;
int i;
for (i = 1; i<=g[course][0]; ++i){
x = g[course][i];
if (!used[x]){
t = match[x];
match[x] = course;
used[x] = 1;
if (t == 0 || dfs(t)) return 1;
match[x] = t;
}
}
return 0;
}
int main(){
int cases;
scanf("%d", &cases);
while (cases--){
int i, j;
int n, p;
scanf("%d%d", &p, &n);
for (i = 1; i <= p; ++i){
scanf("%d", &g[i][0]);
for (j = 1; j<=g[i][0]; ++j)
scanf("%d", &g[i][j]);
}
memset(match, 0, sizeof(match));
for (i = 1; i <= p; ++i){
memset(used, 0, sizeof(used));
dfs(i);
}
int res = 0;
for (i = 1; i <= n; ++i){
if (match[i]>0) ++res;
}
if (res == p) printf("YES\n");
else printf("NO\n");
}
return 0;
}