Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int N,M,K,knoob,psaris[1666],modatos[10101024];
- vector <int> vechy[10101024];
- vector <int> dist[10101024];
- int tomh(int polak, int koulak) {
- int patatas,trexalsa;
- patatas=0;
- for (trexalasa=1;trexalasa<=K;++trexalasa) {
- patatas+=((polak%2+koulak%2)/2)<<(trexalasa-1);
- polak=polak/2;
- koulak=koulak/2;
- }
- return patatas;
- }
- int enosh(int polak, int koulak) {
- int patatas;
- patatas=polak+koulak-tomh(polak,koulak);
- return patatas;
- }
- int fuse (int a,int b) {
- return (a*10000+b);
- }
- int defuse (int a, int pios) {
- if (pios==1) {
- return a/10000;
- }
- else {
- return a%10000;
- }
- }
- void connect(int polak,int koulak, int dvorak) {
- if (polak!=koulak) {
- vechy[polak].push_back(koulak);
- vechy[koulak].push_back(polak);
- dist[polak].push_back(dvorak);
- dist[koulak].push_back(dvorak);
- }
- }
- void kinnect (int polak, int koulak, int dvorak) {
- int trexalasa;
- for (trexalasa=0;trexalasa<=knoob;++trexalasa) {
- connect(fuse(polak,trexalasa),fuse(koulak,trexalasa),dvorak);
- }
- }
- int Diejcraft( int sak) {
- set<pair <int, int> > setparas;
- int who,trexalasa,son;
- int dvorak, tmp;
- memset(modatos,-1,sizeof(modatos));
- modatos[sak]=0;
- setparas.insert(make_pair(0,sak));
- while(setparas.size() != 0 ) {
- who=(*(setparas.begin())).second;
- dvorak=(*(setparas.begin())).first;
- setparas.erase(setparas.begin());
- for (trexalasa=1;trexalasa<=e[who].size(); ++trexalasa) {
- tmp=d[who][trexalasa-1]+modatos[who];
- son=e[who][trexalasa-1];
- if ( modatos[son] == -1) {
- modatos[son] = tmp;
- setparas.insert(make_pair(tmp,son));
- }
- else if (modatos[son]>tmp) {
- setparas.erase(setparas.find(make_pair(modatos[son],son)));
- modatos[son]=tmp;
- setparas.insert(make_pair(tmp,son));
- }
- }
- }
- }
- int main() {
- int trexalasa,trexalasb,dvorak,tmp,polak,koulak;
- scanf("%d %d %d",&N,&M,&K);
- knoob=(1<<K)-1;
- //printf("%d\n",knoob);
- for (trexalasa=1;trexalasa<=N;++trexalasa) {
- scanf("%d",&dvorak);
- for(trexalasb=1;trexalasb<=dvorak;++trexalasb) {
- scanf("%d",&tmp);
- psaris[trexalasa]+=1<<(tmp-1);
- }
- for (trexalasb=1;trexalasb<=knoob;++trexalasb) {
- connect(fuse(trexalasa,trexalasb),fuse(trexalasa,enosh(trexalasb,psarhs[trexalasa])),0);
- }
- }
- for (trexalasa=1;trexalasa<=M;++trexalasa) {
- scanf("%d %d %d",&polak,&koulak,&dvorak);
- kinnect(polak,koulak,dvorak);
- }
- Diejcraft(fuse(1,0));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement