zoj1015
#include<iostream>
using namespace std;
#define Maxn 1001
int n,m;
int Set[Maxn];
bool Data[Maxn][Maxn];
bool Chord;
void Relabel()
{
int num,i,j,Max,MaxValue;
int Link[Maxn];
bool Used[Maxn];
memset(Used,false,sizeof(Used));
Used[1]=true;
for(num=n-1;num>0;num--)
{
memset(Link,0,sizeof(Link));
for(i=1;i<=n;i++)
{
if(!Used[i])
{
for(j=1;j<=n-num;j++)
{
if(Data[i][Set[n-j+1]])
{
Link[i]++;
}
}
}
}
MaxValue=0;
for(i=1;i<=n;i++)
{
if(Link[i]>MaxValue)
{
MaxValue=Link[i];
Max=i;
}
}
Set[num]=Max;
Used[Max]=true;
}
}
void Check()
{
int i,j,t;
int Temp[Maxn];
for(i=1;i<=n&&Chord;i++)
{
memset(Temp,0,sizeof(Temp));
t=0;
for(j=i+1;j<=n;j++)
{
if(Data[Set[i]][Set[j]])
{
t++;
Temp[t]=Set[j];
}
}
for(j=2;j<=t;j++)
{
if(!Data[Temp[j]][Temp[1]])
{
Chord=false;
break;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n||m))
{
int i;
memset(Data,false,sizeof(Data));
int p,q;
for(i=1;i<=m;i++)
{
scanf("%d%d",&p,&q);
Data[p][q]=true;
Data[q][p]=true;
}
Set[n]=1;
Relabel();
Chord=true;
Check();
if(Chord)
printf("Perfect\n");
else
printf("Imperfect\n");
printf("\n");
}
return 0;
}
zoj1053
#include <stdio.h>
#include <memory.h>
#define maxN 21
int path[maxN][maxN];
int city[maxN][maxN];
int from[maxN];
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
void output(int x, int y)
{ if (path[x][y] == 0) return;
output(x, path[x][y]);
printf("\t%d", path[x][y]);
output(path[x][y], y);
}
int main()
{
bool line = false;
int iCase;
scanf("%d", &iCase);
while (iCase--)
{
if (line) printf("\n");
line = true;
int n;
scanf("%d", &n);
memset(city, 0, sizeof(city));
memset(path, 0, sizeof(path));
int i, j, k;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
scanf("%d", &city[i][j]);
if (city[i][j] == -1)
city[i][j] = 32767;
}
for (k = 1; k <= n; k++)
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (city[i][k] + city[k][j] < city[i][j])
{
city[i][j] = city[i][k] + city[k][j];
path[i][j] = k;
}
int fire;
scanf("%d", &fire);
char c;
int m = 0;
while((c = getc(stdin)) != '\n')
{
if (c==' ') continue;
ungetc(c, stdin);
scanf("%d", &from[++m]);
}
for (i = 1; i <= m-1; i++)
for (j = i+1; j <= m; j++)
if (city[from[i]][fire] > city[from[j]][fire])
swap(from[i], from[j]);
printf("Org\tDest\tTime\tPath\n");
for (i = 1; i <= m; i++)
{
printf("%d\t%d\t%d", from[i], fire, city[from[i]][fire]);
if (from[i] == fire) printf("\t%d\n", fire);
else
{
printf("\t%d", from[i]);
output(from[i], fire);
printf("\t%d\n", fire);
}
}
}
return 0;
}
zoj1082
#include<stdio.h>
#include<memory.h>
int g[100][100];
int n;
void floyd()
{
int i,j,k;
for(k=0;k<n;k++)
for(i=0;i<n;i++)
if(g[i][k]!=0)
for(j=0;j<n;j++)
if(g[k][j]&&i!=j)
if((g[i][j]==0)||(g[i][j]>g[i][k]+g[k][j]))
g[i][j]=g[i][k]+g[k][j];
}
int main()
{
int i,j;
int contact,number,time;
while(scanf("%d",&n)&&n)
{
memset(g,0,sizeof(g));
for(i=0;i<n;i++)
{
scanf("%d",&contact);
for(j=0;j<contact;j++)
{
scanf("%d %d",&number,&time);
g[i][(--number)]=time;
}
}
floyd();
int min=30000;
number=-1;
for(i=0;i<n;i++)
{
time=0;
for(j=0;j<n;j++)
if(i!=j)
if(time<g[i][j])
time=g[i][j];
else if(g[i][j]==0)
{
time=30000;
break;
}
if(min>time)
{
number=i;
min=time;
}
}
if(min<30000)
printf("%d %d\n",(++number),min);
else
printf("disjoint\n");
}
return 0;
}
zoj1083
#include <stdio.h>
#include <string.h>
struct corner{
int x1,y1;
int x2,y2;
corner() { x1 = 40, y1 = 40, x2 = -40, y2 = -40; }
};
char gg[30][30];
char solution[26];
char g[26][26];
char g1[26][26];
int number[26];
int used[26];
void addEdge(int i, int j, int &edges)
{
if(g1[i][j]==0)
{
g1[i][j] = 1;
g[i][++edges] = j;
number[j] ++;
}
}
void topSort(int depth, int count)
{
int i, j, edges;
if(depth>=count)
{
for(i=0; i<count; i++)
printf("%c", solution[i]+'A');
printf("\n");
return;
}
for(i=0; i<26; i++)
if (used[i])
if (number[i]==0)
{
solution[depth++] = i;
number[i]--;
edges = g[i][0];
for(j=1; j<=edges; j++)
number[g[i][j]]--;
topSort(depth, count);
for(j=1; j<=edges; j++)
number[g[i][j]]++;
number[i] ++;
depth --;
}
}
int build(corner frame[])
{
memset(g, 0, sizeof(g));
memset(g1, 0, sizeof(g1));
memset(number, 0, sizeof(number));
int i, j;
int count = 0;
for(i=0; i<26; i++)
if(used[i])
{
count++;
int edges = 0;
int x1 = frame[i].x1;
int y1 = frame[i].y1;
int x2 = frame[i].x2;
int y2 = frame[i].y2;
for(j=x1; j<=x2; j++)
{
if(gg[j][y1]!=i)
addEdge(i, gg[j][y1], edges);
if(gg[j][y2]!=i)
addEdge(i, gg[j][y2], edges);
}
for(j=y1; j<=y2; j++)
{
if(gg[x1][j]!=i)
addEdge(i, gg[x1][j], edges);
if(gg[x2][j]!=i)
addEdge(i, gg[x2][j], edges);
}
g[i][0] = edges;
}
return count;
}
int main()
{
int i, j;
int n, m;
char line[30], c;
while (scanf("%d", &n)!=EOF)
{
memset(used, 0, sizeof(used));
scanf("%d\n", &m);
corner frame[26];
for(i=0; i<n; i++) {
gets(line);
for(j=0; j<m; j++)
{
c = line[j] - 'A';
gg[i][j] = c;
if(c!=('.'-'A'))
{
used[c] = 1;
if(frame[c].x1>i) frame[c].x1 = i;
if(frame[c].y1>j) frame[c].y1 = j;
if(frame[c].x2<i) frame[c].x2 = i;
if(frame[c].y2<j) frame[c].y2 = j;
}
}
}
int count = build(frame);
topSort(0, count);
}
return 0;
}